我正试图解决一个小问题:
var setListeners = function()
{
for(var i in sliders)
{
sliders[i].switchBtn.click(function()
{
alert(i);
});
}
}
滑块有三个元素,因此3个switchBtn被赋予一个点击监听器。我预计点击第一个按钮会发出'0'警告,第二个按'1',第三个按'2'警告。但是当我按下每个按钮时,我只得到'2'。
有人可以指出为什么每个新的侦听器功能都会覆盖i的值吗?
答案 0 :(得分:2)
使用闭包,因此内部i
并不总是绑定到外部作用域(这将是循环结束时的最后一个值)。
此处i
的值设置为j
。
var setListeners = function()
{
for(var i in sliders)
{
sliders[i].switchBtn.click((function(j)
{
return function() { alert(j) };
})(i);
}
}
答案 1 :(得分:0)
因为我在函数之外,所以你总是引用同一个变量而且总是2.你需要一个闭包才能让它正常工作:
sliders[i].switchBtn.click((function(n){
return function(){
alert(n);
}
})(i));
n(is i)现在绑定在一个闭包中,您的警报将正确显示。