5

特定のページに多くの .js ファイルが関連付けられているコードに取り組んでいます (それらをライブラリのように利用しています)。各 .js ファイルの内部は次のようになります。

(function() {
    .... all the lib functions and objects ....
})();

いくつか遊んだ後、(function() {...})();の形式の関数が表示されます。自動的に呼び出されます。function() {...}を持つために外側のかっこを取り除くと、コードは無効になります。関数名を追加すると、コードは有効ですが、関数 foo() { ... }が呼び出されるまで実行されません。

ライブラリがこのように書かれている特別な理由はありますか? 変数名などをカプセル化すると思います。ページの読み込み時に自動的に実行できるようにするこれの構文についてはどうですか?

4

3 に答える 3

6

これはIIFE、即時呼び出し関数式と呼ばれます。

関数を含む変数を定義できます。これらの変数は、外側のスコープからは見えず、グローバルな名前空間を妨げません。

(function() {
    var v = ... // this variable can be used in the IIFE but not from outside
})();

外側の括弧が必要な理由は、で始まるステートメントfunction somethingが関数宣言として解釈されるためです。関数宣言には name が必要なため、ここでは無効です。それを表現にするには、トリックを使用する必要があります。括弧はそれを行いますが、たとえば、他のトリックを使用することもできました

+function(){
  ...
}();

しかし、外側の括弧は最も明確で、おそらくそれほど驚くべき解決策ではありません。

于 2013-06-16T18:20:22.150 に答える
1

ほとんどのライブラリは、名前のない無名関数です。

したがって、すぐに実行する必要があります。名前がなく、すぐに呼び出す必要がある関数を後で呼び出すことはできません

于 2013-06-16T18:21:05.870 に答える
1

ページの読み込み時に自動的に実行できるようにするこれの構文についてはどうですか

ページの読み込み時に呼び出されるのではなく、宣言の直後に呼び出されます。これは、呼び出し括弧が含まれているためです。

})();
  ^^

外側の括弧を取り除くとfunction() {...}、コードは無効になります。

これは既知の JavaScript 構文の癖です。すぐに呼び出せるようにするには、関数と見なす必要があります。それ以外の場合は、すぐに呼び出すことができない関数宣言として解釈されます。

ライブラリがこのように書かれている特別な理由はありますか? 変数名などをカプセル化すると思います。

はい、グローバル名前空間をきれいに保つ可能性が最も高いです。

于 2013-06-16T18:21:19.693 に答える