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

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

Linda Hamilton
Linda Hamilton原創
2024-10-30 07:29:03767瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn