簡単ないくつかの簡単な説明は、javascriptの閉鎖を説明します.

1471 ワード

リリースされていないリソースのスタック領域と事前実行されているプロセスとは、最も一般的な例で説明される.
例えば、今はulがあります.下にはたくさんのliがあります.彼らが彼らのために結合してクリックしたイベントを巡回して、クリックした後に現在の下付きを別のfunctionに渡して、追加の処理を行います.
 
  
for(var i=0; i  agroup[i].onclick = function() {
    handler(i);
  }
}
実行結果は明らかですよね?handlerでは、過去を伝えるパラメータiを取得して、あなたが見ているのは全部最大の下付きです.この時、私たちは通常以下の方法で解決します.
 
  
for(var i=0; i  agroup[i].i = i
  agroup[i].onclick = function() {
    handler(this.i);
  }
}
ここでは、まずthisの指向問題について説明します.通常、javascriptの中のthisは現在彼を引用する対象を指しています.上の方はthisに相当します.iという属性が追加されました.彼の値は現在の下付きです.
この問題をクローズドでどう解決しますか?原理は同じです.私たちはあらかじめi値を保存しておく必要があります.または転送と呼ばれます.
 
  
for(var i=0; i  agroup[i].onclick = function(index) {
    return function() {
      handler(index);
    }
  }(i);
}
この時に正しい下付きが得られます.このようにしてi属性を増やすと何が同じですか?つまり、彼らは下付きi値をあらかじめ渡したり、貯蔵したりしています.上記のデモンストレーションでは、Oclickで参照される関数をプリ実行していますが、これは
関数は、内部ブロック関数を返して、リソースが解放されていないスタック領域を形成し、事前実行時にこの作用領域にi値をパラメータとして導入しました.
以上のように、クローズドの役割は、通常は、スコープを変更するか、またはプリ実行することである.上の例は限定的で、クローズドの応用範囲が広く、その因果を理解してこそ、柔軟に使えるということがよく分かりました.
auntion 2011-11-15
メール[email protected]
QQ 82874972
オリジナルの文章はタイピングの苦労と著作者の権益を尊重してください.転載する時はここの作者の情報を削除しないでください.