[英]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
。 除了使用為我們提供的get
和set
方法之外,我們無法訪問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
時都會有效地使用module
和x
不同實例。
差異相當大。
在第一種情況下, 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.