ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の関数呼び出しやクロージャに含まれる括弧は常に単なる構文上の砂糖なのでしょうか?

JavaScript の関数呼び出しやクロージャに含まれる括弧は常に単なる構文上の砂糖なのでしょうか?

DDD
リリース: 2024-11-02 20:33:31
オリジナル
528 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート