首頁 >web前端 >js教程 >為什麼 JavaScript 中的 `(function(){})();` 與 `function(){}();` 不同?

為什麼 JavaScript 中的 `(function(){})();` 與 `function(){}();` 不同?

Linda Hamilton
Linda Hamilton原創
2024-12-13 13:34:15424瀏覽

Why Does `(function(){})();` Differ from `function(){}();` in JavaScript?

深入研究封裝匿名函數的語法

在JavaScript 中,封裝匿名函數涉及將程式碼區塊在匿名編號內並立即執行它。這種語法對於防止全域範圍污染和促進模組化腳本具有重要意義。然而,問題是為什麼 (function(){})();與 function(){}(); 的行為截然不同。

函數宣告與函數表達式

語法差異取決於函數是被解析為 FunctionDeclaration 還是函數表達式。關鍵區別在於是否存在名稱標識符,這對於 FunctionDeclarations 是必需的。

遵循語法規則「function Identifier (FormalParameterListopt) {FunctionBody}」的 FunctionDeclarations 需要命名標識符。

封裝匿名函數

相反,FunctionExpressions 由「function Identifieropt(FormalParameterListopt) {FunctionBody}」控制,允許可選命名。這使我們能夠在括號內創建未命名的函數表達式:

(function () {
    alert(2 + 2);
}());

分組運算符的作用

用於封裝匿名函數的括號起著至關重要的作用,分組運算子。它表示對表達式的求值,並且對 FunctionExpressions 進行求值。因此,用括號括住 FunctionDeclaration 會強制將其視為 FunctionExpression。

上下文理解

FunctionDeclarations 和 FunctionExpressions 的語法規則可能會導致歧義。解析器透過考慮函數出現的上下文來解決這個問題。函數宣告通常出現在全域作用域或函數體內,而函數表達式可以出現在各種上下文中,包括區塊內。

潛在陷阱

在區塊內使用函數時可以提供封裝,但由於不可預測的行為而不鼓勵這樣做。例如:

if (true) {
  function foo() {
    alert('true');
  }
} else {
  function foo() {
    alert('false!');
  }
}

foo(); // Outputs "true" with ambiguous behavior

以上是為什麼 JavaScript 中的 `(function(){})();` 與 `function(){}();` 不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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