Javascript / jquery中的范围和/或单击侦听器问题

时间:2011-03-22 04:52:58

标签: javascript jquery scope

我正试图解决一个小问题:

var setListeners = function()
        {
            for(var i in sliders)
            {
                sliders[i].switchBtn.click(function()
                {
                    alert(i);
                });
            }
        }

滑块有三个元素,因此3个switchBtn被赋予一个点击监听器。我预计点击第一个按钮会发出'0'警告,第二个按'1',第三个按'2'警告。但是当我按下每个按钮时,我只得到'2'。

有人可以指出为什么每个新的侦听器功能都会覆盖i的值吗?

2 个答案:

答案 0 :(得分:2)

使用闭包,因此内部i并不总是绑定到外部作用域(这将是循环结束时的最后一个值)。

此处i的值设置为j

var setListeners = function()
    {
        for(var i in sliders)
        {
            sliders[i].switchBtn.click((function(j)
            {
                return function() { alert(j) };
            })(i);
        }
    }

jsFiddle

答案 1 :(得分:0)

因为我在函数之外,所以你总是引用同一个变量而且总是2.你需要一个闭包才能让它正常工作:

sliders[i].switchBtn.click((function(n){
   return function(){
      alert(n);
   }
})(i));

n(is i)现在绑定在一个闭包中,您的警报将正确显示。