2011-10-04 42 views
7

在下面的結構:IIFE語境問題

(function(){ 

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

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

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

})(); 

爲什麼thiswindow對象? IIFE內的所有內容應該與全球範圍隔離嗎? xy函數還有window全局對象的屬性?

而且,即使我用把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仍然指向window對象 - 我可以叫show()從全球範圍內!怎麼來的?

回答

9

全局上下文(window在瀏覽器中)是價值this當沒有其他值使用時得到的值。

您的本地變量是本地變量(即,不是window的屬性)。它們在var的函數內聲明。

添加var h = (function(){...沒有區別的原因是因爲您調用函數的方式。函數引用不是對象的屬性值(如something.func()),並且您不用.call().apply()調用它,因此它指的是全局(window)對象。這正是語言被定義採取行動的方式。

8

@Point是正確的,但他沒有提出整個問題 - 您可能對this related answer感興趣。這裏的問題是,如果您沒有使用關鍵字new,那麼您沒有實例化一個對象,因此this沒有實例可供參考。在沒有實例的情況下,this指的是window對象。

一般情況下,你不需要this的IIFE內,因爲你要在匿名函數的範圍定義的任何函數或變量直接訪問 - show()可以直接調用x()y(),所以沒有必要對this參考。用new來實例化一個IIFE可能是一個有效的用例,但我從來沒有遇到過。

+0

一個有效的情況是,當你需要將IIFE中的「this」傳遞給另一個使用它進行回調的對象時。 – AndroidDev