簡體   English   中英

以下JS語法有什么區別?

[英]What is the difference in the following JS syntax?

以下是兩種定義BW.Timer的方法。 有人能告訴我有什么區別嗎? 我不確定第一個是否有效,但如果它有效,那么使用myfunc=(function(){}())語法會有什么不同?

BW.Timer = (function () {
    return {
        Add: function (o) {
            alert(o);
        },
        Remove: function (o) {
            alert(o);
        }
    };
} ());

和...

BW.Timer = function () {
    return {
        Add: function (o) {
            alert(o);
        },
        Remove: function (o) {
            alert(o);
        }
    };
};

第一個是立即調用函數的返回值。 第二個是功能。 它基本上歸結為它們之間的區別:

var f = (function() { return 0; })();

var f = function() { return 0; };

由於第一個函數是立即調用的,因此將0的值賦給變量f 第一個f不是函數。 但是,我們必須調用第二個f才能獲得值:

f(); // 0

因此,在您的示例中,第一個BW.Timer是對象文本本身,第二個是返回對象文字的函數。 您必須調用該函數才能訪問該對象:

BW.Timer().Add(x);

為什么要先使用呢?

您可能會問自己為什么會使用類似a = (function() { return {}; })()而不是a = {}的語法,但這是有充分理由的。 與常規函數不同,IIFE(Immeditately-Invoked Function Expression)允許模擬靜態變量(通過單個實例維護其值的變量)。 例如:

var module = (function() {
    var x = 0;

    return {   get: function()  { return x },
               set: function(n) { x = n }
    };

})();

以上是模塊模式的教科書示例。 由於函數是立即調用的,因此變量x被實例化,返回值(對象)被賦予module 除了使用為我們提供的getset方法之外,我們無法訪問x 因此, x是靜態的,這意味着每次使用module時都不會覆蓋其變量。

module.set(5);

module.get(); // 5

另一方面,讓我們看一個將module聲明為函數的示例:

// assume module was made as a function

module().set(5);

module().get(); // 0

當我們調用module() ,每次都會覆蓋x變量。 所以我們每次調用module時都會有效地使用modulex不同實例。

差異相當大。

在第一種情況下, BW.Timer在第一次遇到時執行,這是分配給BW.Timer的靜態版本。 在那種情況下,可以使用BW.Timer.Add(1) 每次調用BW.Timer都是同一個對象。

在第二種情況下, BW.Timer在第一次遇到時不會執行,而是一個函數引用,必須調用BW.Timer() 對於要使用的Add ,必須是BW.Timer().Add(1) 此外,您可以發出var timer = new BM.Timer(); BW.Timer()每個實例在這里都是唯一的。

在第一個示例中, BW.Timer引用自執行函數返回的對象,而在第二個示例中,它引用一個函數對象,換句話說,它是一個可以執行的函數BW.Timer()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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