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+' ');
});
}
答案 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']);
}