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 中国語 Web サイトの他の関連記事を参照してください。