我在jQuery ajax调用的成功函数中有这个代码 success: function(d)
for (var n in d.items)
{
google.maps.event.addListener(markers[d.items[n].id], 'mouseover', function() {
focusMarker(d.items[n].id);
});
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,该函数始终被评估d.items[n].id为d.items集合中的最后一项.
我尝试过这个修改:
for (var n in d.items)
{
var id = d.items[n].id;
google.maps.event.addListener(markers[d.items[n].id], 'mouseover', function() {
focusMarker(id);
});
}
Run Code Online (Sandbox Code Playgroud)
但我的功能总是返回相同的东西.
这是范围问题,还是我的功能定义有问题?
有几种方法可以解决这个问题,最常见的是使用一个函数来保存循环值:
for (var n in d.items) {
(function(id) {
google.maps.event.addListener(markers[id], 'mouseover', function() {
focusMarker(id);
});
})(d.items[n].id);
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果d.items是一个数组,我建议你使用顺序循环,例如:
for (var n = 0; n < d.items.length; n++) {
//..
}
Run Code Online (Sandbox Code Playgroud)
该for-in语句用于枚举对象属性.
如果您在数组或类似对象的数组上使用它,它可能会给您带来一些问题,首先,还会枚举继承的属性,这意味着如果有人扩充了Array.prototype对象,那么这些属性也会在循环中枚举.
此外,规范不保证迭代的顺序,也不能以数字顺序访问属性.