首頁 >web前端 >js教程 >JavaScript 函數呼叫和閉包中的括號總是只是語法糖嗎?

JavaScript 函數呼叫和閉包中的括號總是只是語法糖嗎?

DDD
DDD原創
2024-11-02 20:33:31527瀏覽

Are Parentheses in JavaScript Function Calls and Closures Always Just Syntactic Sugar?

JavaScript 中的表達式閉包和函數呼叫相同嗎?

在JavaScript 中,以下程式碼片段似乎會產生相同的輸出:

<code class="js">(function() {
    bar = 'bar';
    alert('foo');
})();

(function() {
    bar = 'bar';
    alert('foo');
}());</code>

兩個區塊都執行alert('foo')語句並聲明一個可在閉包外部存取的變數bar。唯一明顯的差異在於閉包的語法,使用 )()} 與 }());。

這些構造在功能上等效嗎?

答案:是的,它們是相同的。

其他注意事項:

如果引入附加括號,行為會改變。考慮以下場景:

場景 1:

<code class="js">new (function() {
    this.prop = 4;
})().prop;</code>

此表達式建立函數類別的新實例並存取新實例的 prop 屬性,傳回值 4。它相當於:

<code class="js">function MyClass() {
    this.prop = 4;
}

new MyClass().prop;</code>

場景 2:

<code class="js">new ( function() {
    return { Class: function() { } }; 
}() ).Class;</code>

在這種情況下,新表達式實例化函數的 Class 屬性傳回值。函數呼叫周圍的括號至關重要,表示應立即呼叫該函數。

這相當於:

<code class="js">var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
// Or,
new namespace.Class;</code>

如果從 getNamespace() 的呼叫中刪除了括號,表達式將實例化 getNamespace 類別並存取新實例的 Class 屬性。

以上是JavaScript 函數呼叫和閉包中的括號總是只是語法糖嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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