2011-08-19 1 views
0

다른 함수 내에서 호출 된 메서드 나 함수의 호출 컨텍스트는 무엇입니까?다른 함수 내에서 호출 된 메서드 또는 함수의 호출 컨텍스트를 결정하고 정의하는 방법은 무엇입니까?

브라우저에서 기본 호출 컨텍스트는 window 개체입니다. 다양한 상황에서 어떻게 이것을 피합니까?

포함 함수 내에서 함수가 호출 된 경우 (예 : theFunction();) 호출 된 함수의 호출 컨텍스트가 포함 함수입니까? 이 두 사례

(function() 
{ 
    something.initialize(); 
}()); 

(function() 
{ 
    something.initialize.call(this); 
}()); 

에서

... 호출 컨텍스트는 동일?

답변

2

이들은 동일하지 않습니다. 다음은 문맥에 대해 언급 할 때 this에 대해 이야기했다고 가정합니다.

첫 번째 예에서, initialize, thissomething을 나타냅니다. 두 번째 예제에서는 브라우저에서 window 인 전역 객체를 참조합니다. this가 참조 무엇


는 함수가 호출 된 방법에 의해 결정된다합니다. 함수 "독립"을 호출

  • func(), : 오가지 경우가 있습니다 this는 전역 객체를 참조합니다. 은 func.prototype에서 상속받은 빈 객체를 참조합니다.

  • obj.func() 개체의 속성으로 함수를 호출하면 this은 개체 obj을 참조합니다. apply 또는 call으로 함수를 호출

  • func.apply(foo)

    , func.call(foo) : this 먼저 인수로서 전달 된 객체를 의미한다.

인 ECMAScript 5도 즉시 함수를 호출하지 않고 특정 객체 this을 결합 할 수있는 .bind()[MDN]을 소개했다. 두 번째 예에서, initialize 내부 thiswindow을 참조 이유


이제 이해 :

외부 함수는 "독립"(첫 번째 경우),이 참조됩니다 내부 그래서 this라고

window.다음은 thiscall으로 전달하고 thisinitialize에서 window (네 번째 경우) 안에 설정합니다.


추가 읽기 :

  • MDN - this, 나는 몇 가지 예 위에서 쓰기 모두에 대해 설명합니다.
2

아니요, 이들은 동일하지 않습니다. call 메서드의 첫 번째 매개 변수는 해당 함수 내에 this 값을 설정합니다. 예 1의 this은 이론적으로 something에 대한 참조를 포함해야합니다. 예 2의 this은 자체 실행 기능의 this에 해당합니다.

1

함수는 생성자 (new이라는 함수)가 아니면 컨텍스트를 만들지 않습니다.

두 번째 예제에서 컨텍스트는 undefined (글로벌 개체로 변환 됨, window)입니다. ES5 엄격 모드에서는 아무 것도 변환되지 않습니다.

문맥에 대한 주제로 John Resig의 interactive JavaScript tutorial을 사용하는 것이 좋습니다.

2

호출 될 때 함수에서 사용할 수있는 환경은 여러 가지를 기반으로합니다.

  1. 귀하의 예제에서 초기화 방법에 대한 다른 어느 this 바인딩되지 않고 A A 함수 이름 바인딩 특별한 arguments 객체
  2. 바인딩
  3. 실제 매개 변수 바인딩, 어떤
  4. 경우
  5. 함수가 작성된 당시의 환경 체인. 이것은 "폐쇄"라는 용어의 "가까운"부분입니다. javascript 함수는 함수 객체가 존재할 때 범위 내에있는 모든 변수를 "닫습니다". 하여 예에서

는 단지 1에있어서, 본체의 thisthis 값을 전달하는 대신 something 효과를 갖는다 call를 사용하는 선택에 의해 영향을 받는다.

사양의 관련 부분은 제어 기능 개체 F에 포함되는 기능 코드의 실행 컨텍스트를 입력 할 때 다음 단계가 수행되는 부분 10.4.3

시작, 호출 측은 thisArg를 구비하고, 호출자 argumentsList 제공 : ...