自己実行型の JavaScript 関数の 2 つのバージョンを見てきました。
(function() { ... })()
と
(function() { ... }())
関数実行「()」の異なる配置に注意してください
これら2つに違いはありますか?
自己実行型の JavaScript 関数の 2 つのバージョンを見てきました。
(function() { ... })()
と
(function() { ... }())
関数実行「()」の異なる配置に注意してください
これら2つに違いはありますか?
行っていることの効果を得るには多くの方法がありますが、厳密に言えば、このトピックはクロージャーの主題とは接線の関係にあるだけです。
問題はこれです: JavaScript では、function
キーワードは2 つの異なる目的を果たします:
var
ステートメント (変数宣言)に似ていますが、関数用です。ここでの問題は、パーサーがfunction
ステートメントの先頭を確認すると、関数を宣言するつもりであると想定することです。つまり、上記のケース 1 です。関数を宣言する場合、同じステートメントで呼び出すことはできません。関数宣言ステートメントは関数を宣言するだけです。
したがって、関数の作成とその即時呼び出しだけで構成されるステートメントが必要な場合は、パーサーを式を解析する気分にさせる必要があります。全体を括弧で囲むことは、そのための 1 つの方法にすぎません。
パーサーが見ているのは式ステートメントであることを納得させる「トリック」は次のとおりです。
var dummy = function() { ... whatever ... } ();
!function() { ... whatever ... } ();
0 + function() { ... whatever ... } ();
これらすべて、および無数の他の例では、パーサーがfunction
キーワードを認識したときに式の途中で認識できるように設定されています。
アイヒ氏が式の途中で関数オブジェクトのインスタンス化に別のキーワードを選択した場合 (たとえば、ラムダなど)、問題はありません。
lambda () { ... whatever ... } ();
しかし、彼はしませんでした。
function
括弧は、実行できるように、式 (キーワードで開始できない) を持っていることを保証します。
また、FunctionDeclaration とあいまいになる可能性があるため、ExpressionStatement を function キーワードで開始することはできません。
これも機能します:
(((((function() {...}))())));
これらのいずれかの正しい用語は、すぐに実行される関数です。
どちらも同じように機能しますが、Douglas Crockfordは読みやすさの理由から後者を推奨しています。
関数がすぐに呼び出される場合、生成される値が関数自体ではなく関数の結果であることを明確にするために、呼び出し式全体を括弧で囲む必要があります。
したがって、そのアドバイスに従いたい場合は、以下を使用することをお勧めします。
(function() { ... }())
Function を「第一級市民」として扱うため、前者の方が優れています。括弧を使用して関数をラップし、呼び出します。
Em..後者に関しては、構文があいまいになることも避けます。
しかし、私は前者をお勧めします。