簡體   English   中英

立即調用函數表達式(IIFE)與否

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM