2015-06-13 65 views
0

即時調用的函數表達式(IIFE)中的thisvar之間是否有區別?IIFE:var vs this - 有什麼區別嗎?

(function(){ 
    var foo = 0; 
    this.bar = 0; 
})(); 
+1

','var'地方。檢查'console.log(這個===窗口)'。 – dfsq

+0

http://stackoverflow.com/questions/11285975/difference-between-var-and-this-in-javascript-functions可能的重複 –

回答

2

如果你的代碼是在全球範圍內執行,那麼兩個選項:

  1. 你在use strict模式,在這種情況下,this點什麼(null或undefined),然後你會看到一個例外。

  2. 您在use strict模式不是,然後this指向窗口,在這種情況下,您將設置bar作爲一個全局變量。

var保持並不會被暴露在IIFE的外線電話的局部變量(它在運行相同的範圍內)。

0

當然有。

  • foo是IIFE
  • bar內作用域一個變量將針對任何this在執行上下文結合進行評估。
1

var是一個局部範圍的變量。也就是說,它不會在IIFE之外提供。

另一方面,this.bar將屬性添加到當前對象。你的情況是window

var MyModule = (function(exports){ 
     var foo = 0; 
     exports.bar = 0; 

     return exports; 
    })(MyModule || {}); 

上面的代碼是一個簡單的實現模塊模式的:

如果你想變量,函數或任何成員導出到其它範圍,我會建議以下解決方案。

在另一方面,如果要定義什麼this的IIFE裏面,你可以使用call調用它:

// You don't need "exports" anymore 
    // since "this" works the same way 
    var MyModule = (function(){ 
     var foo = 0; 
     this.bar = 0; 

     return this; 
    }).call(MyModule || {}); 

在這一天結束的this價值取決於如何一個函數被調用。如果您沒有提供thiscallbindapply的含義,則取決於函數的調用方式。例如,如果一個函數是一個對象的一部分,那麼this會是誰擁有該函數的對象:this`設置全局變量

var obj = { 
    doStuff: function() { 
     // "this" is "obj" by default 
    } 
}; 
相關問題