2013-01-14 39 views
2

我看到很多代碼,如:立即調用的函數表達式(IIFE)與未

var myApp ={}; 
(function() { 
    console.log("Hello"); 
    this.var1 = "mark";  //"this" is global, because it runs immediately on load. Caller is global 
    myApp.sayGoodbye = function() { 
     console.log("Goodbye"); 
    }; 
})(); 

導致匿名函數立即執行。但是,與僅將內聯代碼相比,這有什麼優勢?

var myApp ={}; 
console.log("Hello"); 
var1 = "mark";  
myApp.sayGoodbye = function() { 
    console.log("Goodbye"); 
}; 

顯然,這是一個與功能的範圍內做的,但作爲函數是匿名的,並呼籲通過窗口,它的範圍(即this)是全球性的,不是嗎?

+0

在第二個片段中,var1附加到窗口範圍,第一個不是。 – mpm

+0

但是當我用Chrome瀏覽示例1時,'var1'是全局的。 – Mark

+0

這個結構的原因不在我們看到的代碼中。或者它完全沒用。請向我們展示更多代碼。 –

回答

3

通常情況下,你會這樣:

 var myApp ={}; 
     (function() { 
      console.log("Hello"); 
      var var1 = "mark"; 
      myApp.sayGoodbye = function() { 
       console.log("Goodbye"); 
      }; 
     })(); 

的主要區別是,var1不擾亂全局命名空間。此次通話後,var1仍然與以前相同(通常未定義)。

由於var1只能從閉包中定義的函數來訪問,所以它被稱爲「私有」。

除了避免可能的衝突原因之外,只是在不使用全局變量時不保留全局變量。

在這裏,您沒有局部變量,而是全局變量,其定義爲this.var1。這可能是一個錯誤,或者原因會在代碼的其他地方找到。

+0

謝謝,我認爲這是最接近的解釋。只要'var'聲明瞭anon fn中的變量,它們就不會泄漏到全局名稱空間中。我發現JavaScript中的'this'的定義非常混亂! – Mark

3

一個原因:將代碼封裝在匿名函數中允許您創建一個模塊,該模塊將公共API與私有函數以及僅在模塊內部使用的變量區分開來。這可以避免污染全局名稱空間。

var myApp ={}; 
(function() { 
    console.log("Hello"); 
    this.var1 = "mark"; 

    function helper() {/*Some code here*/;} 

    myApp.sayGoodbye = function() { 
     helper() 
     console.log("Goodbye"); 
    }; 
})(); 

我可以說:

var myApp ={}; 
console.log("Hello"); 
var var1 = "mark"; 

function helper() {/*Some code here*/;} 

myApp.sayGoodbye = function() { 
    helper() 
    console.log("Goodbye"); 
}; 

但隨後在全球範圍內包含了一個叫做helper函數,它是沒有用的,使用你的模塊的人,並可能導致與其他模塊可能的命名衝突。

我可以選擇僅包含helper作爲myApp的一種方法。

var myApp ={}; 
console.log("Hello"); 
var var1 = "mark"; 

myApp.helper = function() {/*Some code here*/;} 

myApp.sayGoodbye = function() { 
    this.helper() 
    console.log("Goodbye"); 
}; 

不過,我可能希望防止用戶直接調用helper,在這種情況下,這不會做。

相關問題