为什么变量只传递jQuery中for循环的第一个值?

时间:2014-05-25 04:51:25

标签: javascript jquery

ident的值在第一个注释处发生变化,但它在第二个注释(在jQuery函数中)中始终显示存储在arr[0]['ident']的值。

代码:

for (i=0;i<arr.length;i++)
{
    var ident = arr[i]['ident'];
    console.log(ident+' ');
    $(document).on('click','#'+ident, function() {
        console.log('over'+ident+' ');
    });
}

1 个答案:

答案 0 :(得分:2)

JavaScript具有功能范围,而不是块范围。您可以在循环中使用var ident,但这并不意味着您实际上正在创建新变量ident;你的函数中只会有一个ident。在循环内创建/绑定的所有函数共享与该单个ident变量相同的引用。

当您的任何事件处理程序运行时,ident已重复重置为新值,直到最后一次迭代时将其设置为arr[arr.length - 1]['ident']。每个事件处理函数都具有ident的相同值,因为它们都共享对同一ident变量的引用。

要解决此问题,您需要将每个函数传递给自己的变量以关闭,通常使用IIFE

for (i=0;i<arr.length;i++)
{
    (function (ident) {
      console.log(ident+' ');
      $(document).on('click','#'+ident, function() {
          console.log('over'+ident+' ');
      });
    })(arr[i]['ident']);
}