2016-09-28 11 views
1

JS에서 어휘 범위와 실행 컨텍스트에 대해 배우고 질문을 보았습니다.외부 환경을 참조 할 때 왜이 특정 변수에 액세스 할 수 없습니까?

키워드 this에 대한 나의 이해는 제한적일 수 있지만 모든 함수의 현재 실행 컨텍스트에서 모든 변수를 참조하는 것으로 나타났습니다.

function a(){ 
    function b(){ 
    console.log(this); 
    } 
    var myVar = 2; 
    b(); 
} 
var myVar = 100; 
a(); 
:이 예를 들어 1

이제 값에 할당됩니다 myVar에에 콘솔 로그를 얻을 수 있습니다, 여기에

function b(){ 
    console.log(this); 
} 
var myVar = 1; 
b(); 

:

이 예제를 고려

함수 b가 호출되면 100에 할당 된 myVar에 대한 참조가 표시됩니다. 2에 할당 된 myVar에 대한 참조가없는 이유는 무엇입니까?

'this'가 현재 함수의 어휘 환경을 나타내지 않습니까? 이 경우 함수 b는 전역 환경이 아닌 함수 a로 묶입니다.

답변

4

this에 대한 귀하의 이해는 완전히 잘못되었습니다.

this의 값은 함수가 호출 된 방법에 따라 다릅니다 (일반적으로). 자세한 내용은 How does the “this” keyword work?을 참조하십시오.

는 경우 : 브라우저

  • 당신의 JS는 (그것이 있어야하는)
  • 함수가 명시적인 상황
  • 불려 strict mode에서 실행되지에서
    • ... thiswindow 개체입니다.


      일반적으로 변수가 선언되면 변수가 선언 된 범위에만 존재합니다. 그것은 어떤 객체의 속성이 아닙니다.

      한 가지 예외가있다 : 변수는 전역에 선언

      (즉, 어떤 함수의 외부 또는 let 또는 var 함수 내)없이 다음도 window 객체의 속성이된다.


      효과는 두 가지가 결합 된 것입니다.

      b();에는 문맥이 없습니다. 따라서 thiswindow입니다. var myVar = 100;은 모든 함수 외부에 있으므로 전역 변수와 따라서 window 속성이 있습니다.

    +0

    은 (는) 함수 a의 상황에서 b가 아닙니까? 따라서 b를 함수 a에서 외부 환경에 대한 참조로 함수? –

    +0

    @ user3882106 - 아니요. 앞에서 말했듯이 컨텍스트는 선언 된 곳이 아닌 함수가 호출되는 방식에 따라 결정됩니다. http : // stackoverflow를 참조하십시오.co.kr/questions/3127429/how-does-this-keyword-work를 참조하십시오. 컨텍스트와 범위를 혼동하지 마십시오. – Quentin