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