2010-05-06 2 views
1

자바 스크립트, 이러한 같이 (또는 다른 변수에 "함수에 대한 참조를"지정) : 위의Javascript에서 앨리어싱 된 함수가 "this"를 터치하지 않는 한 함수 별칭이 작동한다는 것은 사실입니까? 우리는 기능을 앨리어싱 경우

f = g; 
f = obj.display; 
obj.f = foo; 

모든 3 선, 그들은만큼 작동합니다 오른쪽의 함수/메소드가 this을 터치하지 않습니까? 모든 인수를 전달하기 때문에 오른쪽에있는 함수/메소드가 this을 사용하는 경우에만 엉망이 될 수 있습니다.

실제로 g의 속성이 window 인 경우 1 번 줄은 아마도 괜찮습니다. gobj.display을 참조하면 동일한 문제가 발생합니다.

obj.display 터치 this, 그것은이 obj을 의미하는 것입니다 라인 2에서

,하지만 f가 호출 될 때 thiswindow, 그래서 그들은 다르다. 3 행에서

, 그것은 동일합니다 foo 그것이 window의 속성이 있다면 window을 참조 this를 사용하고있는 동안 fobj의 코드 내에서 호출 될 때, 다음 thisobj입니다. (전역 함수).

그래서 라인 2

f = function() { obj.display.apply(obj, arguments) } 

라인 3과 같이 쓸 수있다

:

obj.f = function() { foo.apply(window, arguments) } 

이 올바른 방법인가? 그리고 이것 외에 다른 방법이 있습니까?

+0

이 날 M.C. 생각했다 그것은 다음과 같이 작동 해머 – hobodave

+0

알아. 나는 원래 질문에서 언급하지 않으려 고 노력했다. –

+0

축하합니다. 자바 스크립트에서 객체 지향 프로그래밍을 싫어하는 이유를 발견했습니다. 바운드 기능이 없기 때문에 항상 상황을 염두에두고 (따라서)이 점을 염두에 두어야합니다. 이제 실제 OOP 언어 (미안 :)로 이동할 수 있습니다. – wump

답변

3

그러나 JavaScript 함수는 기본적으로 1 급 개체이므로 실제로는 별칭이 아닙니다. 당신이하는 일은 변수의 값을 다른 변수에 할당하는 것입니다.이 경우에는 값이 단지 함수가됩니다.

마법 변수는 약간 다릅니다. 자바 스크립트에서 메소드는 클래스 나 객체에 바인딩되지 않습니다. 다른 대부분의 언어와 같습니다. 메서드를 호출 할 때 은 도트 연산자로 설정되거나 또는 메서드를 적용합니다. 당신이 사용하는 폐쇄에 의해 개체에 대한 방법을 결합 할 수

var i = 1; 
var f = function() { alert(this.i); } 
f(); // in a browser, alerts 1, because this will be window if it isn't anything else. 

var obj = { i: 10 }; 
obj.g = f; 
obj.g(); // alerts 10, because the dot binds this to obj 

var other_obj = { i: 23 }; 
f.apply(g); // alerts 23, because now apply binds this to other_obj 

:

var f = function() { alert(this.i); } 
var obj = { i: 10 }; 

obj.m = function() { f.apply(obj); } 
obj.m(); // alerts 10 

var g = obj.m; 
g(); // alerts 10, because now the closure is called, which binds this correctly. 
1

"this"와 스코프가 함수, 특히 콜백에 적용될 때의 의미는 고전적인 JavaScript "gotcha"인 것처럼 보입니다.

Dojo에는 문제를 해결하는 hitch() 메소드가있어 콜백 메소드에 예상되는 컨텍스트를 얻을 수있는 좋은 방법을 제공합니다. 비 도장 개발자는 아이디어를 빌리기 위해 Dojo hitch() 코드를 살펴볼 수 있다고 생각합니다.

article은 "this"문제의 일부 측면과 Dojo hitch() 사용 방법을 설명합니다.

1

'이'당신이이 방법으로 객체를 호출하는 경우에만 함수 내에서 올바른 객체를 참조 :

obj.f(); 

자바 스크립트 "바인딩 기능"에 대한 지원 부족으로이 작동하지 않습니다이 (아무튼 ' t 메소드가)에 속한 것을 반대 기억 '이'지금 대신 예상 문맥의 창 또는 현재 함수 객체를 가리키는으로

var x = context.lineTo; 
x(10,10); 

에 lineTo은 혼란스러워합니다. 따라서 실제로, 귀하는 항상 귀하의 경우에 신청해야합니다.