2013-07-08 3 views
3

에서의 배경 등을 포함하여 기능을 주위에 전달하고 필수적인 경우에 샘플 문제 고장 : 그래서내가 자바 스크립트 이해하지 못하는 뭔가가 자바 스크립트

a = function() { 
     this.b = 5; 
    } 

    a.prototype.c = function() { 
     alert(this.b); 
    } 

    var d = new a(); 
    var e = d.c; // how do I save a ref to the method including the context (object)?? 

    d.c(); // 5 -> ok 
    e(); // undefined -> wtf?? 

왜 기능의 컨텍스트없이 호출 중입니다 마지막 예? 문맥으로 어떻게 부를 수 있습니까?

답변

5

d.c :-) 사전에

덕분에 언 바운드 인스턴스 메소드와 같다.

e.call(d); 
2

당신에게 :

var e = d.c.bind(d); 

또는 this 인수로 de 전화 : 당신은 d에 바인딩 된 새로운 기능을 만들 수 Function.prototype.bind을 사용할 수 있습니다 (.bind의 첫 번째 인수는 this 인수입니다) 컨텍스트를 올바르게 가져 오기 위해 객체를 사용하여 메소드를 호출해야합니다. 그래서 :

var e = $.proxy(d.c, d); 
: 예를 들어

jQuery를에
var e = d.c.bind(d); 

는 이전 버전의 브라우저에서도 사용할 수있는 proxy method있다 :

var e = function() { return d.c(); }; 

새로운 브라우저에서 동일한 작업을 수행 할 bind method을 사용할 수 있습니다

1

this 값을 확인하는 중입니다. 이것은 다음과 같은 방법으로 해결 : 그것을 해결하는 방법

myObject.something();//this in something is myObject 
window.something();//this is window 
button.onClick=function();//this when button is clicked is button 

가 이미 주어, 그것은 두 번째 시간 제한은 closure 전달의 setTimeout

var test = function() { 
    var me = this;// set reference to this 
    this.sayAgain=function(){ 
    console.log("Hi, I am "+me.toString()); 
    } 
} 
test.prototype.toString=function(){ 
    return "test"; 
} 

test.prototype.say = function() { 
    console.log("Hi, I am "+this.toString()); 
} 

var t = new test(); 
setTimeout(t.say,50);//=window passing functon without ref to this 
setTimeout(function(){ 
    t.say(); 
},150);//=test passing ref with function 
setTimeout(t.sayAgain,200);//=test using me as the saved this context 

를 사용하여 다음 예에서와 같이 콜백을 지나가는 일반적인 함정이다 setTimeout에 말 콜백을 수백 번 전달할 계획이지만 테스트 객체 인스턴스를 몇 개만 만들면 마지막 인스턴스 (sayAgain)의 구현이 약간 더 잘 수행됩니다.

이렇게하면 테스트 인스턴스를 만들 때 closure를 만들지 만 sayAgain을 콜백으로 전달할 때가 아니기 때문에 많은 테스트 인스턴스를 만들고 많은 경우 say을 전달하지 않으면 this.me와 this.sayAgain을 함수 본문을 닫고 say을 종료로 전달하십시오.

Function.prototype.bind을 사용할 수 있지만 IE < 8에서는 지원되지 않으며 t.say을 사용하여 나의 예와 같이 클로저를 만들지 확실하지 않습니다.

관련 문제