9

私は本を​​読んでいて、secrets of the js ninjaこのようなコードをよく見ました

(function(){
  something here;
  })();

なぜ関数を括弧で囲む必要があり、その後にもう 1 組の括弧を追加する必要があるのでしょうか?

4

5 に答える 5

5

スクリプトがロードを完了すると、それ自体を呼び出す自己呼び出し関数です。引数なしで呼び出すことも、 または などの引数を追加することもできwindowますdocument

jQuery が使用する方法で使用します。

(function( window, undefined ) {
    // jQuery code
})(window);

同じことを行う (ほぼ) 代替構文:

! function( window, undefined ){
    // some code…
}(window);

詳細については、http ://sarfraznawaz.wordpress.com/2012/01/26/javascript-self-invoking-functions/ をご覧ください。

于 2013-07-13T20:07:23.360 に答える
5

これ

(function(){
  alert('hello');
})();

これは関数ですが、自動的に呼び出されるため、手動で呼び出すことはできません/できません

forこれらは、次のようなループに役立ちます

i は 5 秒後に 9 になるため、これは失敗します。

for(var i = 0; i < 10; i++) {
   window.setTimeout(function(){
      console.log(i);
   }, 5000)
}

だからあなたはこれを行うことができます

for(var i = 0; i < 10; i++) {
   (function(a){
      window.setTimeout(function(){
         console.log(a);
      }, 5000)
   })(i);
}

このような「プライベート」スコープを作成するのにも適しています

(function(){
   var test = 'hello';
   console.log( test ); // 'hello'
}());

   console.log( test ); // 'undefined'
于 2013-07-13T20:07:41.083 に答える
3

括弧の最後のセットにより、関数がすぐに実行されます。関数は、どこにも割り当てることなく作成および実行されます。このような関数でコードをラップする理由は、コードをカプセル化するためです。たとえば、次のようにします。

var myVar = 'whatever';
function shout() { alert(myVar); }

ここでは、グローバル変数になっているだけですmyVarshoutコンソールを開いてwindow.myVarorwindow.shoutと入力すると、これらの変数にアクセスして変更できます。関数でラップすることにより、これらの変数は外側の関数に対してローカルのままになります。

(function() {
    var myVar = 'whatever';
    function shout() { alert(myVar); }
})();

window.myVarおよびwindow.shout未定義です。その関数内にのみ存在します。

このパターンは、ローカル変数の周りにクロージャーを作成するためにも使用されます。ループ内の JavaScript クロージャー – 簡単な実用例を参照してください。

于 2013-07-13T20:12:49.717 に答える
0

自己呼び出し関数、基本的にはすぐに自分自身を呼び出します。

通常、jQuery などの変数を渡すために使用され、それ$が本当に jQuery オブジェクトであることを確認します。

(function($){
    // $ now is equal to jQuery
})(jQuery);
于 2013-07-13T20:06:52.497 に答える
0

作成したばかりの関数が実行されます。これを行う理由は、記述したすべてのコードが新しいスコープ内に含まれるためです。これは、 と を定義するvarsと、作成したばかりfunctionsの の範囲内に保持されることを意味します。function()

つまり、コードをカプセル化します。

于 2013-07-13T20:07:50.463 に答える