1. ホーム
  2. javascript

[解決済み] 即時関数呼び出し構文

2022-09-22 10:16:45

質問

ある JSLint オプションがあり、これは実際に The Good Parts の 1 つです。

(function () {

  // ...

})();

のように書く必要があります。

(function () {

  // ...

}());

私の質問はこうです -- なぜこの2番目の形式がより良いと考えられるのか、どなたか説明していただけませんか? より弾力性があるのでしょうか? エラーが発生しにくいのでしょうか? 最初の形式に対してどのような利点があるのでしょうか?


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

var someVar = (function () {

  // ...

}());

一番外側の括弧は構文的には不要ですが、冒頭の括弧は、代入される値が ではなく 関数そのものではなく、呼び出された関数の結果であることを前もって示します。

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

どのように解決するのですか?

ダグラス・クロックフォード(Douglass Crockford)の スタイル・コンベンション・ガイド : ("invoked immediately"で検索してください)

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

つまり、基本的には、関数の値と関数の値の間の区別をより明確にするものだと考えています。つまり、これはスタイル上の問題であり、コード自体の本質的な違いではありません。

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