2013-06-05 34 views
1

兩種方法我已經看到了(我知道有更多的)使用IIFE的:IIFE調用

(function(){ 
    console.log(this); 
}).call(this); 

(function(){ 
    console.log(this); 
})(); 

是否有任何理由對第一個使用.call(this)();不會在函數中產生相同的上下文嗎?

+0

相關:[爲什麼使用javascript函數包裝「.CALL(這)」](http://stackoverflow.com/q/4542942/1048572) – Bergi

回答

3

這取決於代碼的執行位置。

.call(this)明確將this設置爲您傳遞給.call的對象。只有使用();纔會將this設置爲window(或在嚴格模式下設置爲undefined)。

如果代碼在全局範圍內執行,它將是相同的。如果不是,那麼如果this不是指window(或者是undefined),那麼您將得到不同的結果。

實施例:

var obj = { 
    foo: function() { 
     (function(){ 
      console.log(this); // this === obj 
     }).call(this); // this === obj 

     (function(){ 
      console.log(this); // this === window 
     })(); 
    } 
}; 

obj.foo(); 

More information about this on MDN

+0

Felix,據我所知,IIFE總是指在非嚴格模式下的窗口對象,而在嚴格模式下未定義,所以... – Givi

+1

IIFE是一個正常功能。你可以用'.call'或者'.apply'明確地設置'this'。 –

+0

沒關係我有什麼東西混在一起,你是對的。 – Givi