JavaScript では、「(function () { } ) ( )」と「(function () { } ( ) )」は機能的に同じですか?

Linda Hamilton
リリース: 2024-10-30 07:29:03
オリジナル
729 人が閲覧しました

Are

JavaScript の関数呼び出し構文: "(function ( ) { } ) ( )" と "(function ( ) { } ( ) )" は機能的に同じですか?

質問:

次の 2 つの JavaScript コード ブロックについて考えてみましょう:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);
ログイン後にコピー
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);
ログイン後にコピー

両方のコード ブロックは、alert('foo' を実行します) )、次にalert(bar)、それぞれ「foo」と「bar」が表示されます。 2 つの唯一の違いは、関数呼び出しの構文です。これらは機能的に同一ですか?

答え:

はい、一般に、2 つのコード ブロックは機能的に同等です。どちらも新しい関数を定義し、すぐに実行してから、グローバル スコープ内の bar 変数にアクセスします。

例外:

ただし、次のようなエッジ ケースもあります。 2 つの構文は異なる動作をする可能性があります。具体的には、関数の前または関数内の .something の後に新しいコードを導入すると、それらは同じように動作しなくなります。

コード 1:

new (function() {
    this.prop = 4;
}) ().prop;
ログイン後にコピー

このコードは、関数のクラスの新しいインスタンスを作成し、新しいインスタンスの prop プロパティを取得し、4 を返します。これは次と同等です。

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
ログイン後にコピー

コード 2:

new ( function() {
    return { Class: function() { } }; 
}() ).Class;
ログイン後にコピー

このコードは、Class プロパティで new を呼び出します。関数呼び出しのかっこは外側のかっこ内にあるため、新しい式はトリガーされず、代わりに通常どおり関数が呼び出され、戻り値が返されます。新しい式は .Class までをインスタンス化し、それをインスタンス化します。これは以下と同等です:

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;
ログイン後にコピー

getNamespace() の呼び出しを括弧で囲まないと、このコードは (new getNamespace()).Class として解析され、getNamespace クラスをインスタンス化し、その Class プロパティを返します。新しいインスタンス。

以上がJavaScript では、「(function () { } ) ( )」と「(function () { } ( ) )」は機能的に同じですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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