2012-10-25 58 views
0

请给我一些线索,这个JavaScript问题。 我有一个全局变量标记。并尝试将每个标记推向标记。 但问题是,推到标记后。我试图提醒内部函数和外部函数的值。结果是完全不同的。函数中的标记给我一些标记,但外面的标记保持空白。为什么我有不同的标记全局变量值?Javascript全局变量只更新匿名函数内

这是我的代码片段:

for (var i = 0; i < netotal; i++) { 
    setTimeout(function() { 
     marker = new google.maps.Marker({ 
          position: pos[iterator], 
       map: map, 
       draggable: false, 
       animation: google.maps.Animation.DROP, 
       icon: neicon   
     }); 
     iterator++; 
     markers.push(marker);console.log(markers); 
    }, i * 50);  
} 

alert (markers); 

感谢您的热心帮助或线索。

+0

里面你的问题,你声明函数内部的警告是“标志”和外面的功能在“标记”上。也许有些打字错误? 此外,它也有助于共享其他代码。我看不出什么时候警报会被触发,这是知道这里至关重要的事情。紧接在for循环之后触发警报吗?然后这些标记确实是空的,因为当延迟的函数执行时它将被填充。 – rmoorman

+0

@rmoorman,yap我犯了一些输入错误。我在片段中添加了一些行。控制台结果和警报是不同的。 – syant

+0

然后它是由事实引起的,即标记将在稍后填充(由于setTimeout)。你的编辑也清楚了。你可以通过用类似 的setTimeout(function(){console.log(markers);},netotal * 50)替换alert来确认。 – rmoorman

回答

1

您在使用setTimeout调用的函数中推送到markers,因此推迟不会发生,直到稍后。但是在任何超时发生之前,您立即打电话给alert(markers)。所以当时阵列是空的。

UPDATE:

要查看markers最后的内容,你需要另一个setTimeout

setTimeout(function() { alert(markers); }, netotal*50); 
+0

啊我看到,所以如何运行下一个脚本后加载所有的标记? – syant

+0

也许使用另一个'setTimeout'具有更高的超时。如果 – Barmar

+0

将其设置为0,但我的标记[0]在函数外部仍未定义 – syant

1

取决于范围,要访问全局标记使用window.markers

+0

试图更新到window.markers.push(标记)没有帮助:( – syant