범위

2012-08-05 3 views
2

다음과 같은 코드가있는 경우 :범위

var global = this; 
function A() { 
    function B() { 
     return this; 
    } 
    return B(); 
} 
var C = new A(); 
C === global // true 

왜 함수 B의 this 글로벌 공간이 아니라 객체 A의 this을 참조 않습니다를?

+0

:

그냥 전화에 적합한 개체 컨텍스트를 얻기 위해 어떤 객체에 함수를 연결하는 데 거추장스러운 것 때문에

모든 기능을 명시 적으로 개체 컨텍스트를 지정할 수있는 .call 방법을 상속 @ Pointy의 대답 외에도,이 [실제 기술은 여기에서] 볼 수 있습니다 (http://stackoverflow.com/questions/11814953/what-is-the-difference-in-the-invocation-of-this-in- 이 예제들). (두 번째 코드 스 니펫) – phant0m

답변

3

this의 값은 모든 함수 호출시 결정됩니다. 컨텍스트없이 B이 호출되기 때문에 값은 전역 개체입니다.

그것은 단순히 복사하여 외부 환경에서 this을 보존 할 수있다 : 당신은 당신이 기능을 원하는대로 할 수 있기 때문에

이에 대한 추론은 다음과 같습니다

function A() { 
    var x = this; 
    function B() { 
    return x; 
    } 
    return B(); 
} 
0

것은 뾰족한의 정답을 동반. 함수 A에서 함수 B를 반환하고 전역 변수로 저장할 수 있습니다.

또는 함수 B를 메서드로 Object 나 12 개의 객체에 추가 할 수 있습니다. 또는 AJAX 콜백에서 사용할 수도 있고 타이머에서 콜백으로 사용할 수도 있습니다.

엔진은 함수 B에서 일어날 일을 모르기 때문에 this은 호출 될 때 함수가 호출되는 모든 것을 참조합니다.

이것은 언어에 많은 역 동성을 추가하지만 주어진 시간에 "this"가 무엇을 가리키고 있는지 잘 모르겠다면 많은 두통이 추가됩니다. 엄지

규칙 : 함수는 객체의 메소드로서 부착 직접 이거나 함수가 .call 또는 .apply와 호출되는 다음, myFunc.call(myObj) 같은 this를 컨텍스트 공급되는

하면 window을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. 정말 고마워요. 지금은 이해. –

2

this은 범위와 아무 관련이 없습니다. 변수가 아닙니다. 현재 실행중인 함수의 객체 컨텍스트로 평가되는 키워드입니다. 함수의 객체 컨텍스트는 호출 방법에 따라 결정됩니다. 함수가 어디에 또는 어떻게 정의되는지는 중요하지 않습니다.

fn()과 같은 함수를 호출하면 객체 컨텍스트에 있지 않고 단지 this의 단순한 위치에서 오류가 발생하면 언어가 잘못 처리하려고 시도합니다. 이것은 엄격한 모드에서 다소 고정되어 있습니다 (undefined).

어떤 개체 I.E.의 속성으로 함수를 호출 할 때. obj.fn()이면 obj은 해당 호출에 대해 this에 바인딩됩니다.

return B.call(this);