2009-09-08 4 views
2

I는 다음과 같이 수행하여 객체에 상태를 유지하기 위해 노력하고있어 : 내가 인스턴스 foo 변수를 설정할참조 인스턴스 변수

obj = function() { 
    this.foo = undefined; 
    this.changeState = function() { 
     (function() { this.foo = "bar" })(); // This is contrived, but same idea. 
    }; 
}; 

을에 "바"나는 changeState 메서드를 호출 할 때 . 예를 들어

는 :

지금까지 내가 말할 수있는
o = new obj(); 
o.changeState(); 
alert(o.foo); // This should say "bar" 

, 무슨 일이 일어나고은 "이"내부 익명 함수에 창을 가리키는 것입니다. 나는 무슨 일이 일어나고 있는지 잘 모르겠습니다.

올바른 경로에 있습니까? 더 나은 접근 방법이 있습니까?

답변

2

함수의 기본이 (브라우저에서 창입니다) 글로벌 될 것를 호출 할 때 당신이이 컨텍스트를 지정하지 않으면.

대안은 다음과 같습니다 : -

obj = function() { 
    this.foo = undefined; 
    this.changeState = function() { 
    (function() { this.foo = "bar" }).call(this); // This is contrived, but same idea. 
    }; 

};

또는 -

obj = function() { 
    var self = this; 
    this.foo = undefined; 
    this.changeState = function() { 
    (function() { self.foo = "bar" })(); // This is contrived, but same idea. 
    }; 

};

1

나는 그것을 알아 냈다. 단지 내부 익명 함수에 그 현재 컨텍스트에 대한 참조를 저장하고 사용하는 데 필요한 :

obj = function() { 
    this.foo = undefined; 
    var self = this; 
    this.changeState = function() { 
     (function() { self.foo = "bar" })(); 
    }; 
}; 
2
function obj() { 
    this.foo = undefined; 
    this.changeState = function() { this.foo = "bar" }; 
}; 

var o = new obj(); 
o.changeState(); 
alert(o.foo); 

이 맞습니다. 왜 함수 참조를 할당하는 데 자체 호출 함수를 사용해야하는지, 왜 함수 선언 대신 생성자에 대한 함수 표현식을 사용해야하는지 잘 모르겠습니다.

3

이 주제는 많이 나오지만, "this"가 SO 검색에서 제거되었으므로 검색하기가 어렵습니다.

기본적으로 JavaScript에서 this은 항상 컨텍스트 개체가 아니라 호출하는 개체를 참조합니다. 여기에서 전역 범위에서 o.changeState()를 호출하면 this이 window를 참조합니다.

이 경우에는 클로저가 작동하는 데 실제로 내부 함수가 필요하지 않습니다. changeState 함수 자체만으로도 어휘 범위를 닫을 수 있습니다.

obj = function() 
{ 
    var self = this; 
    this.foo = undefined; 
    this.changeState = function() 
    { 
    self.foo = "bar"; 
    } 
}