2011-10-04 3 views
7

를 발행 :인생 컨텍스트는 다음과 같은 구조에서

(function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

thiswindow 객체를 참조합니까? IIFE 내부의 모든 것을 글로벌 범위에서 분리해야합니까? xywindow 전역 개체의 속성입니까?

또한, 내가 사용하는 경우에도 처음에 var h = ...을 넣어 :

var h = (function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

this는 여전히 윈도우 객체를 참조 - 난 그냥 전역에서 show()를 호출 할 수 있습니다! 어째서?

답변

9

브라우저에서 글로벌 컨텍스트 (window)는 사용할 값이 없을 때 this이됩니다.

로컬 변수가 로컬입니다 (즉, window 속성이 아님). 그것들은 var이라는 함수 안에서 선언됩니다.

var h = (function(){...을 추가하는 이유는 함수 호출 방식 때문입니다. 함수 참조는 객체의 속성 값 (something.func())이 아니며 .call() 또는 .apply()과 함께 호출하지 않으므로 전역 (window) 객체를 참조합니다. 이것은 언어가 작동하도록 정의 된 방식입니다.

8

@Pointy는 정확하지만 전체적인 문제는 제시하지 않습니다. this related answer에 관심이있을 수 있습니다. 여기서 문제는 new 키워드를 사용하지 않는 경우 객체를 인스턴스화하지 않으므로 this을 참조 할 인스턴스가 없다는 것입니다. 인스턴스가없는 경우 thiswindow 개체를 나타냅니다.

, 당신은 익명 함수의 범위에 정의 된 함수 나 변수에 직접 액세스 할 수 있기 때문에, 인생에서 this 필요하지 않습니다 일반적으로

- show() 직접 x()y()를 호출 할 수 있도록 this 참조 할 필요가 없습니다 . new으로 IIFE를 인스턴스화 할 수있는 유효한 유스 케이스가있을 수 있지만 그 일은 결코 발생하지 않았습니다.

+0

유효한 사례는 IIFE에서 "this"를 콜백을 만드는 다른 개체에 전달해야하는 경우입니다. – AndroidDev