这是因为该p
变量由您的闭包共享,因此只有一个 p 变量。当你的处理程序被调用时,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));
}
闭包优化
由于在评论中有很多关于闭包的讨论,我决定放这两个屏幕截图,显示闭包得到了优化,并且只包含了所需的变量
此示例http://jsfiddle.net/TnGxJ/2/显示了如何仅a
包含
在这个例子中http://jsfiddle.net/TnGxJ/1/,因为有一个eval
,所以所有的变量都被括起来了。