Javascript迭代器将无法工作,但硬编码的数字将

时间:2011-04-27 22:55:13

标签: javascript loops google-maps-api-3

我正在尝试使用google maps api创建动态标记,并且在迭代使用变量tat时遇到问题。

我已经省略了生成标记和地图的代码,因为它似乎工作正常。这是用于生成信息窗口的代码。

此代码产生错误'this_marker_info [$ n]'[undefined]不是对象

for(var $n = 0; $n < business.length; $n++){
   google.maps.event.addListener(this_marker[$n], 'click', function() {
       this_marker_info[$n].open(map, this_marker[$n]);
   });      
}

此代码有效

for(var $n = 0; $n < business.length; $n++){
   google.maps.event.addListener(this_marker[$n], 'click', function() {
       this_marker_info[0].open(map, this_marker[0]);
   });      
}

我所做的就是在行第二个例子中用数字0交换$ n读取“this_marker_info [$ n] .open(map,this_marker [$ n]);”

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:4)

这是典型的关闭问题。 到this_marker_info[$n].open(map, this_marker[$n]);执行时,您已完成循环,$n的值为business.length

解决方案是编写一个闭包:

for(var $n = 0; $n < business.length; $n++){
    (function ($the_actual_n) {
        google.maps.event.addListener(this_marker[$the_actual_n], 'click', function() {
            this_marker_info[$the_actual_n].open(map, this_marker[$the_actual_n]);
        });
    }($n)); // <-- call this 'anonymous' function with $n
}

答案 1 :(得分:3)

使用Array.forEach()是修复它的一种不错的方法:

business.forEach(function(item, $n) {
   google.maps.event.addListener(this_marker[$n], 'click', function() {
       this_marker_info[$n].open(map, this_marker[$n]);
   });      
}

这样,包含函数永远不会增加$n,因此它会可靠地保持原始值。

在旧版浏览器中使用Array.forEach() see this