即時関数呼び出し構文


110

JSLintオプションがあります。実際には、グッドパーツの1つです。「即時呼び出しの前後に括弧が必要です」。つまり、

(function () {

  // ...

})();

代わりに次のように書く必要があります

(function () {

  // ...

}());

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


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

var someVar = (function () {

  // ...

}());

最も外側の括弧は、構文的に不要であるが、左括弧が割り当てられている値であるアップフロント指示与えない機能自体ではなく、呼び出される関数の結果を。

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


これを指摘してくれてありがとう。JSLintの「ループ内で関数を作成するときは注意してください」という警告メッセージを取り除く方法を見つけられませんでした。私は注意して、関数をクロージャに入れましたが、それでもJSLintは不平を言いました。これで、2番目のパターンを使用したことを前提としています。
viam0Zah 2009年


私はこれまでずっと「間違った」ことをしてきました。そして、私が「いつも」と言うとき、私は1995
Dave Land

回答:


73

Douglass Crockfordのスタイルコンベンションガイドから:(「invoked immediate」を検索)

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

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

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


1
これを読んでよかった。私はJavascript:The Good Partsを読み終えたばかりで、関数の呼び出し結果を割り当てるのは本当に悪い構文だと考えていました。何が起こっているのかを理解するには最初と最後の行を調べる必要があるためです。彼は本のラッピング括弧を使用していませんが、彼がそれらを推奨する理由を正確に理解しています。
Skilldrick、

2
@ altCognito、PPTに新しいリンクを提供できますか?
th1rdey3 2013年

1
私はWebを調べましたが、それでもそのPPTのコピーが見つかりません
Forethinker '20 / 07/20

1
元のPPTは見つかりませんでしたが、彼のJavaScriptコンベンションガイドにある同じポイントを見つけることができました。
cgp 2014

archive.orgにありますか?
ジョングリーン

2

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

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

  2. 関数式は、関数functionで始めることはできません。

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


デーサン、あなたは別の質問に答えています。パーサーが関数式と関数宣言を区別できるように、括弧で囲まれていることが構文上必要な場合があるのは正しいことです。しかし、私の質問は、呼び出し括弧の配置についてです。3番目の点は不正確です。その場合、囲み括弧は不要です。
Bobby Eickhoff

すぐに呼び出される匿名関数が変数に割り当てられていない最初の2つの理由で括弧が構文的に必要である最初の例に答えました。3番目の理由は、あなたが言ったことさえ復活させることでした:「左括弧は、割り当てられている値が関数自体ではなく、呼び出された関数の結果であることを前もって示しています。」しかし、それは明確ではなかったと思います。
Dathan

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.