2012-03-22 8 views
2

최상위 함수가 window 개체의 멤버이고 그 내부에 thiswindow을 참조한다는 사실과 일치합니다.최상위가 아닌 함수가 모든 객체의 멤버입니까?

최상위 수준이 아닌 함수의 경우 this은 여전히 ​​window이지만 window의 멤버가 아닙니다! inner 만약

function topLevel1() { 
    alert(this) 
} 

function topLevel2() { 
    function inner() { 
     alert(this) 
    } 

    inner() 
} 

topLevel1()    // alerts DOMWindow 
alert(window.topLevel1) // alerts text of topLevel1, as expected 

topLevel2()     // again, alerts DOMWindow 
alert(window.inner)   // undefined 
alert(window.topLevel2.inner) // undefined 
  1. 누구의 회원 그것이 window의 멤버도 topLevel2의도는 다음과 같습니다

    는 일부 코드입니까?
  2. 어떻게 thiswindow 일 수 있습니까? 그렇지만 window의 회원이 아니십니까?
  3. 자바의 법칙이 this == owner 인 경우 owner.을 통해 현재 메소드가 호출 되었습니까? (등 생성자 apply, call 같은 특별한 경우를 제외하고)

답변

2

다시 한 번, 함수의 값은 이고, 위치 또는 설계 방법이 아닌 함수가 호출됩니다.

그냥 함수를 그냥 같은 코드에서 어디

foobar() 

를 호출하면

는 그 this 값은 항상 window (비 엄격 모드) 또는 undefined (엄격한)입니다. 이제는 .apply(), .call() 또는 .bind()으로 함수를 호출하는 것과 같이 this을 수정할 수있는 방법이 많이 있습니다. 이러한 모든 방법을 사용하면 주어진 기능에 대해 this 값을 수정할 수 있습니다. 또한 new 키워드를 사용하여 함수를 호출하면 this이 새로 생성 된 객체를 반환합니다.이 객체도 반환됩니다.

그래서 함수의 위치는 컨텍스트에 대해 0을 알려주거나 this입니다.

이제 특정 질문에 대답 :

  1. inner

  2. 위에서 설명한 topLevel2 (ES3)에서 Activation Object의 구성원 또한

  3. 위에 덮여 그게 전부 추측
+0

보다 ks, 지금은 분명 해요. – Fixpoint

+0

JS가 'this == obj'라는 이름의 함수'f'를 호출하는 구문'obj.f'를 허용하지 않는 이유를 이해하지 못 하겠지만 말입니다. – Fixpoint

+0

그걸 무시하면'.'은 회원 전용입니다. – Fixpoint

1

this 키워드 환상적인 기준은 다음 http://www.quirksmode.org/js/this.html

topLevel2 내의 내부() 함수()는 topLevel2 볼 수있다. 범위 문제입니다. 그것이 당신이 정의되지 않은 이유입니다.

관련 문제