2014-09-19 2 views
2

...둘 다 어떻게 같은 변수를 참조합니까? 나는 매우 혼란 상황이

(function sayStuff(){ 
    this.word = "hello2"; 
    (function(){ 
     console.log(this.word); 
    }()) 
}()) 


var myObject = { 
    word: "bar", 
    func: function() { 
     (function() { 
      console.log(this.word); 
     }()); 
    } 
}; 
myObject.func(); 

출력

hello2 hello2

어떻게 이런 일이? myObject의 'func'클로저가 실제로 sayStuff()에서 참조되는 변수를 볼 수 있습니까? 나는 IIFE가 내부를 글로벌 범위에서 보호하기위한 것이라고 생각 했습니까?

+0

나는 노력을하지만 8 분 기다려야했다, 나는 학습 이후에 로그인하지 않은 나에게 말했다. 감사! – Exitos

답변

5

두 경우 모두 thiswindow으로 내부 함수 표현식을 호출 할 때 제공하지 않는 전역 기본 컨텍스트를 대체합니다. 당신이 컨텍스트를 유지하려면

, 내부적으로 인생을 사용하거나 컨텍스트를 호출하지 않습니다

(function sayStuff(){ 
    this.word = "hello2"; // still this is window, use var if you don't want that 
     (function() { 
      console.log(this.word); // window.word 
     }).call(this); // well, this is window... 
}()) 


var myObject = { 
    word: "bar", 
    func: function() { 
     (function() { 
      console.log(this.word); // myObject.word 
     }).call(this); 
    } 
}; 
myObject.func(); 
2

인생은 로컬 숨길 변수 범위합니다 (var 키워드로 만든 즉 사람들을). this.word 터치

모든 사용자의 기능 (즉 안하지 new 키워드하지 apply, call 또는 bind 갖는 객체의 메소드로서)이므로 this 각 경우 window 인 글로벌 컨텍스트에서 호출된다. 글로벌 변수를 다루고 있습니다.

당신이 이와 비슷한 더 많은 일을 할 것입니다 개인 변수를 원한다면 :

(function(){ 
    var word = "hello2"; 
    (function(){ 
     console.log(word); 
    }()) 
}()) 
관련 문제