web-dev-qa-db-ja.com

即時関数呼び出し構文

JSLint オプションがあります。これは実際には良い部分の1つであり、「[即時の呼び出しの周りに括弧が必要です」」という意味です。

(function () {

  // ...

})();

代わりに次のように記述する必要があります

(function () {

  // ...

}());

私の質問はこれです-この2番目のフォームがより良いと考えられる理由を誰でも説明できますか?より回復力がありますか?エラーが発生しにくい?最初のフォームに比べてどのような利点がありますか?


この質問をして以来、関数の値と関数の値を視覚的に明確に区別することの重要性を理解するようになりました。即時呼び出しの結果が割り当て式の右側である場合を考えてみましょう。

var someVar = (function () {

  // ...

}());

一番外側の括弧は構文的には不要ですが、開き括弧は割り当てられている値がnot関数そのものではなく、呼び出される関数。

これは、コンストラクター関数の大文字化に関するCrockfordのアドバイスに似ています-ソースコードを見る人にとって視覚的な手がかりとなることを意図しています。

110
Bobby Eickhoff

ダグラスクロックフォードの スタイルコンベンションガイドから :(「invoked soon」を検索)

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

したがって、基本的に、彼は、関数値と関数の値との区別をより明確にすると感じています。したがって、それは実際にはコード自体の本質的な違いではなく、文体的な問題です。

参照の更新、古いPPTもう存在しません

72
cgp

すぐに呼び出された匿名関数は、次の理由で括弧で囲まれます。

  1. これらは関数式であり、括弧を省略すると、構文エラーである関数宣言として解釈されます。

  2. 関数式は、Word関数で開始できません。

  3. 関数式を変数に割り当てると、関数自体は返されず、関数の戻り値が返されます、したがって、括弧はそれらの中にあるものを評価し、値を生成します。 関数が実行され、末尾の括弧..}()により、関数がすぐに実行される場合。

2
Dathan