これは、p
変数がクロージャによって共有されているためです。p 変数は 1 つだけです。ハンドラーが呼び出されるまでに、 p は変更されています。
クロージャーを凍結するというテクニックを使用する必要があります
for (var i = 0; i < that.pairs.length; i++) {
// The extra function call creates a separate closure for each
// iteration of the loop
(function(p){
p.t.click(function() {
that.doToggle(p);
});
})(that.pairs[i]); //passing the variable to freeze, creating a new closure
}
これを達成するためのより簡単な方法は次のとおりです。
function createHandler(that, p) {
return function() {
that.doToggle(p);
}
}
for (var i = 0; i < that.pairs.length; i++) {
var p = that.pairs[i];
// Because we're calling a function that returns the handler
// a new closure is created that keeps the current value of that and p
p.t.click(createHandler(that, p));
}
閉鎖の最適化
コメントでクロージャーとは何かについて多くの議論があったので、クロージャーが最適化され、必要な変数だけが囲まれていることを示すこれらの 2 つのスクリーンショットを掲載することにしました。
この例http://jsfiddle.net/TnGxJ/2/のみがどのようa
に囲まれ
ているかを示しています
この例http://jsfiddle.net/TnGxJ/1/では、 があるためeval
、すべての変数が囲まれています。