javascript自己実行関数

1731 ワード

前言
各関数には、環境で実行すると、変数オブジェクトの作用ドメインチェーン、コンテキスト環境が作成されます.したがって、関数内部で定義された変数と関数は、関数の内部のみにアクセスできます.外部ではアクセスできません.このコンテキスト環境では、関数を呼び出したときにプライベートメンバを作成する方法が提供されます.
自己実行関数
式の後に括弧を入れるとすぐに実行されますが、以下の表記は間違っています.
function (){}();
function foo(){}();
私たちはこのように書くべきです.
(function(){})();
(function(){}());
(function foo(){})();
(function foo(){}());
括弧()とJSの&&&&12539;異形、カンマなどの演算子は関数式と関数声明の上で曖昧性を解消するので、その中の一つが表現式であることが分かり次第、他のものもすべて表現式としてデフォルトになります.下記の関数は直ちに実行できます.
//  10
var i = function () { return 10; } ();
  console.log(i);   
//  test
true && function () { 
  console.log("test");   
}();
 //  test
0, function () {
  console.log("test");  
}();
原理
解像度が大域のfunctionまたはfunction内部のfunctionキーワードを解析する場合、デフォルトではfunction宣言ではなく、function表現であり、
(function () {} ()); 
(function () {})(); 
大きい括弧はコードのコードを全部くくればいいです.JavaScriptの括弧には語句が含まれていないので、解像器はfunctionのキーワードを解析する時、相応のコードをfunction式に解析します.
自己実行の匿名関数とクローズド
for(var i=0;i<10;i++){
  setTimeout(function(){
    console.log(i);
  },1000); 
}
私達は0~9を出力したいですが、このコードの実行結果は10個の10個を出力しました.なぜなら、匿名関数function(){console.log(i);}に外部iに対する参照を保持しています.この匿名関数にはiがないので、上に探します.ここでforはループしました.i=10です.だから10個の10個を出力します.
どのように修正するかは、自己実行の匿名関数に変更され、異なるiが各実行関数内にパラメータiを伝達する.
for(var i=0;i<10;i++){
  (function(e){            //e  i   
    setTimeout(function(){
      console.log(e);
    },1000)
  })(i); 
}

for(var i=0;i<10;i++){
    setTimeout((function(e){
      return function(){
        console.log(e);
      }
    })(i),1000);
}
参照http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html