18

簡単ですが、一部の js ファイル (Ember や JQuery.js など) が で始まるのは(function() {...})();なぜですか?

4

2 に答える 2

20

この形式のコードは(function() { /* code here */ })()、「即時呼び出し関数式」として知られています。クロージャの設定によく使用されるため、グローバル スコープを汚染することなく変数を定義できます。この理由から、Ember、jQuery、および他のほとんどすべての「プラグイン」でそれを見つけることができます。グローバル スコープを汚染することは一般に悪い考えですが、すべてのサイトで動作する必要があるプラグインでは、サイトの作成者が使用している変数を誤って上書きしないようにすることが特に重要です。

もちろん、他の用途もあります。たとえば、次のように反復変数を「アンカー」するために使用できます。

for( i=0; i<links.length; i++) {
    (function(i) {
        links[i].onclick = function() {alert(i);};
    })(i);
}
// without the IIFE, all links would alert the value of links.length instead.

「ジャストインタイム」計算など、ほとんどの人がおそらく私をリンチする IIFE を時々使用する場合もあります。

if( (function() {
      var party=document.getElementById('party').children, l=party.length, i, r=0;
      for( i=0; i<l; i++) if( party[i].children.length > 0) r++;
      return r;
  })() == 6) {
    // your Party is full
}

上記は、ステートメントに飛び込む前に計算された場合にはるかに優れているifため、... 私がこのステートメントで行っているようにしないでください!

于 2013-10-10T13:33:09.407 に答える
7

構文はで始まりました

(function(){
  /* code */ 
}());

コードの最後の行の直後に実行される即時起動匿名関数として認識されます。他の関数のスコープ変数に使用されます。

詳細: http://en.wikipedia.org/wiki/Immediately-invoked_function_expression

于 2013-10-10T13:31:13.550 に答える