113

実際、良い部分の 1 つであるJSLintオプションがあります。これは、"[requires] 即時呼び出しの周りに括弧が必要です"。

(function () {

  // ...

})();

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

(function () {

  // ...

}());

私の質問はこれです -- この 2 番目の形式の方が優れていると考えられる理由を説明できる人はいますか? それはより弾力性がありますか?エラーが起こりにくい?最初のフォームよりもどのような利点がありますか?


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

var someVar = (function () {

  // ...

}());

最も外側の括弧は構文上不要ですが、左括弧は、割り当てられる値が関数自体ではなく、呼び出された関数の結果であることを前もって示します

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

4

3 に答える 3

76

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

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

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

更新された参照、古い PPT はもう存在しません

于 2009-06-02T13:11:06.463 に答える
2

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

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

  2. 関数式は、関数という単語で始めることはできません。

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

于 2012-02-23T21:06:57.513 に答える