[英]Brackets wrapping of functions - (function() { }) () , and `.call()`
我已經寫了一段時間的JavaScript,最近一直在玩coffeescript。 我注意到coffeescript以下列方式編譯函數:
(function() {
}).call()
我還注意到人們以這種方式編寫函數:
(function() {
})()
據我了解,這些都是自稱的匿名函數。 首先,擁有.call()
和just ()
之間的區別是.call()
只是一種更具語義的書寫方式()
。
另外,為什么在通常不需要的情況下,coffescript將整個文件包裝為匿名函數? 這有任何性能或其他優勢嗎? 這些自調用匿名函數何時應使用?
謝謝
使用.call()
將IIFE的上下文更改為父范圍的this
值。
第一this
將是[object Window]
,在瀏覽器環境中的全局范圍:
(function () {
console.log(this);
})();
第二個是完全相同的:
(function () {
console.log(this);
}).call(this);
不同的是,在的ECMAScript 5的strict mode
時,第一實施例this
是不確定的:
(function () {
'use strict';
console.log(this); // undefined
})();
但是使用嚴格模式和 .CALL()的時候,這又是用正確的在全球范圍內this
背景下:
(function () {
'use strict';
console.log(this);
}).call(this);
這是一個顯示此內容的jsFiddle 。 主要的區別是, normal
IIFE失去它的this
背景下,一些CommonJS的平台評估文件與特定的this
。
CoffeeScript中這樣做是為了確保您的代碼具有相同的this
上下文在那里的安置范圍(父范圍) -因為功能不正常繼承this
從周圍的上下文對象。
使用上面的模式,您應該將函數邏輯包裝在那里,以避免將所有代碼放在全局范圍內,並避免發生變量/命名沖突,然后您可以在其中創建諸如模塊之類的內容,並僅返回您所使用的API需要,例如:
var Module = (function () {
'use strict';
return {
someMethod: function () {
// do something
}
}
})();
// call it:
Module.someMethod();
每個函數都創建自己的作用域,因此將代碼塊包裝在其中將保護變量/函數名稱不相互沖突。 我們還可以從以下閉包中訪問“私有”方法:
var Module = (function () {
'use strict';
var _privateMethod = function () {};
return {
someMethod: function () {
_privateMethod();
}
}
})();
如果我們不希望用戶也公開訪問這些方法,則可以這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.