![](/img/trans.png)
[英]Immediately-Invoked Function Expression (IIFE) In JavaScript - Passing jQuery
[英]Immediately-Invoked Function Expression (IIFE) vs not
我看到很多類似的代碼:
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");
};
顯然,這與函數的范圍有關,但是由於函數是匿名的並由window調用,因此它的范圍(即this
)是全局的,不是嗎?
通常,您將有:
var myApp ={};
(function() {
console.log("Hello");
var var1 = "mark";
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
})();
主要區別在於var1
不會使全局名稱空間混亂。 調用之后, var1
仍與以前相同(通常未定義)。
由於只能從閉包中定義的函數訪問var1
,因此稱其為“私有”。
除了避免可能引起沖突的原因外,在不使用時不要保留全局變量也更清潔。
在這里,您沒有局部變量,而是定義為this.var1
的全局變量。 這可能是錯誤,或者原因可能在代碼的其他地方找到。
一個原因:將代碼包裝在匿名函數中,使您可以創建一個模塊,該模塊將公共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
,在這種情況下將無法這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.