ホームページ >ウェブフロントエンド >jsチュートリアル >`(function(){})();` が JavaScript の `function(){}();` と異なるのはなぜですか?

`(function(){})();` が JavaScript の `function(){}();` と異なるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-13 13:34:15424ブラウズ

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

カプセル化された匿名関数の構文の詳細

JavaScript では、カプセル化された匿名関数にはコード ブロックをかっこで囲み、それをすぐに実行することが含まれます。 。この構文は、グローバル スコープの汚染を防止し、モジュール化されたスクリプトを容易にする上で重要です。しかし、なぜ (function(){})(); なのかという疑問が生じます。 function(){}(); とは別個に動作します。

関数宣言と関数式

構文の違いは、関数が FunctionDeclaration として解析されるか、または FunctionDeclaration として解析されるかによって異なります。 FunctionExpression。決定的な違いは、FunctionDeclarations に必須の名前識別子の有無にあります。

文法規則「function Identifier (FormalParameterListopt) {FunctionBody}」に従う FunctionDeclarations には、名前付き識別子が必要です。

匿名関数のカプセル化

逆に、 FunctionExpressions は、「function Identifieropt(FormalParameterListopt) {FunctionBody}」によって管理され、オプションの名前付けを許可します。これにより、括弧内に名前のない関数式を作成できるようになります。

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

グループ化演算子の役割

匿名関数をカプセル化するために使用される括弧は、次のように重要な役割を果たします。グループ化演算子。これは式の評価を意味し、FunctionExpressions が評価されます。そのため、FunctionDeclaration を括弧で囲むと、それが FunctionExpression として扱われるようになります。

コンテキストの理解

FunctionDeclaration と FunctionExpressions の文法規則は、あいまいさを引き起こす可能性があります。パーサーは、関数が出現するコンテキストを考慮してこれを解決します。 FunctionDeclaration は通常、グローバル スコープまたは関数本体内にありますが、FunctionExpressions はブロック内を含むさまざまなコンテキストに現れる可能性があります。

ブロック内で関数を使用する際の潜在的な落とし穴

カプセル化を提供できますが、予測できない動作が発生するため推奨されません。例:

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

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

以上が`(function(){})();` が JavaScript の `function(){}();` と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。