2014-05-25 35 views
1

ident的值在第一个注释中发生了变化,但是在第二个注释中(在jQuery函数中)ident始终显示存储在arr[0]['ident']处的值。为什么变量只传递jQuery中for循环的第一个值?

代码:

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

回答

2

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

当您的任何事件处理程序运行时,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']); 
} 
+0

解释一下好吗? – halkujabra

+0

其实我试图找到一个合适的重复来关闭这个 – meagar

+0

@meagar我找不到一个。是的,请解释一下。这没有意义。 – ChrisRockGM

相关问题