首頁 > web前端 > js教程 > JavaScript 中的「(function () { } ) ( )」和「(function () { } ( ) )」功能相同嗎?

JavaScript 中的「(function () { } ) ( )」和「(function () { } ( ) )」功能相同嗎?

Linda Hamilton
發布: 2024-10-30 07:29:03
原創
764 人瀏覽過

Are

JavaScript 中的函數呼叫語法:「(function ( ) { } ) ( )」和「(function ( ) { } ( ) )」功能相同嗎?

問題:

考慮以下兩個JavaScript 程式碼區塊:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);
登入後複製
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);
登入後複製

兩個程式碼區塊都會執行alert ('foo' ) 接著是alert(bar),分別顯示「foo」和「bar」。兩者之間的唯一差異是函數呼叫的語法。它們的功能相同嗎?

答案:

是的,一般來說,這兩個程式碼區塊在功能上是等效的。它們都會定義一個新函數,立即執行它,然後在全域範圍內存取 bar 變數。

例外:

但是,存在以下邊緣情況:這兩種語法的行為可能不同。具體來說,如果您在函數之前或函數內的 .something 之後引入新程式碼,它們的行為將不再相同。

程式碼 1:

new (function() {
    this.prop = 4;
}) ().prop;
登入後複製

此程式碼建立函數類別的新實例並擷取新實例的 prop 屬性,並傳回 4。它相當於:

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
登入後複製

程式碼 2:

new ( function() {
    return { Class: function() { } }; 
}() ).Class;
登入後複製

此程式碼在 Class 屬性上呼叫 new。由於函數呼叫的括號位於外括號內,因此它們不會觸發 new 表達式,而是正常呼叫函數,並傳回其傳回值。新表達式實例化 .Class 並實例化它。它相當於:

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;
登入後複製

如果在呼叫getNamespace() 時沒有括號,此程式碼將解析為(new getNamespace()).Class,實例化getNamespace 類別並傳回該類別的Class 屬性新實例。

以上是JavaScript 中的「(function () { } ) ( )」和「(function () { } ( ) )」功能相同嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板