簡體   English   中英

用括號括起的函數-(function(){})()和`.call()`

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

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