3

自己実行型の JavaScript 関数の 2 つのバージョンを見てきました。

(function() { ... })()

(function() { ... }())

関数実行「()」の異なる配置に注意してください

これら2つに違いはありますか?

4

4 に答える 4

5

行っていることの効果を得るには多くの方法がありますが、厳密に言えば、このトピックはクロージャーの主題とは接線の関係にあるだけです。

問題はこれです: JavaScript では、functionキーワードは2 つの異なる目的を果たします:

  1. 関数宣言 statementを導入します。これは、varステートメント (変数宣言)に似ていますが、関数用です。
  2. より大きな式のコンテキストで関数リテラル式を導入します。

ここでの問題は、パーサーがfunctionステートメントの先頭を確認すると、関数を宣言するつもりであると想定することです。つまり、上記のケース 1 です。関数を宣言する場合、同じステートメントで呼び出すことはできません。関数宣言ステートメントは関数を宣言するだけです。

したがって、関数の作成とその即時呼び出しだけで構成されるステートメントが必要な場合は、パーサーを式を解析する気分にさせる必要があります。全体を括弧で囲むことは、そのための 1 つの方法にすぎません。

パーサーが見ているのは式ステートメントであることを納得させる「トリック」は次のとおりです。

var dummy = function() { ... whatever ... } ();

!function() { ... whatever ... } ();

0 + function() { ... whatever ... } ();

これらすべて、および無数の他の例では、パーサーがfunctionキーワードを認識したときに式の途中で認識できるように設定されています。

アイヒ氏が式の途中で関数オブジェクトのインスタンス化に別のキーワードを選択した場合 (たとえば、ラムダなど)、問題はありません。

lambda () { ... whatever ... } ();

しかし、彼はしませんでした。

于 2012-09-13T13:46:15.003 に答える
1

function括弧は、実行できるように、式 (キーワードで開始できない) を持っていることを保証します。

ECMAscript 言語仕様から:

また、FunctionDeclaration とあいまいになる可能性があるため、ExpressionStatement を function キーワードで開始することはできません。

これも機能します:

(((((function() {...}))())));​
于 2012-09-13T13:41:45.567 に答える
1

これらのいずれかの正しい用語は、すぐに実行される関数です。

どちらも同じように機能しますが、Douglas Crockfordは読みやすさの理由から後者を推奨しています。

関数がすぐに呼び出される場合、生成される値が関数自体ではなく関数の結果であることを明確にするために、呼び出し式全体を括弧で囲む必要があります。

したがって、そのアドバイスに従いたい場合は、以下を使用することをお勧めします。

(function() { ... }())
于 2012-09-13T14:01:21.290 に答える
0

Function を「第一級市民」として扱うため、前者の方が優れています。括弧を使用して関数をラップし、呼び出します。

Em..後者に関しては、構文があいまいになることも避けます。

しかし、私は前者をお勧めします。

于 2013-08-11T10:02:42.913 に答える