在javascript中,在for循环的每次迭代中声明一个新的、唯一的变量的好方法是什么?

在javascript中,在for循环的每次迭代中声明一个新的、唯一的变量的好方法是什么?,javascript,google-maps,Javascript,Google Maps,我有以下for循环: for (loc in locations){ var newLoc = locations[loc].split(", ") var uniquevar = new google.maps.Marker({ position: new google.maps.LatLng(newLoc[0], newLoc[1]), map: map, title: loc }); google.maps.event

我有以下for循环:

for (loc in locations){
    var newLoc = locations[loc].split(", ")
    var uniquevar = new google.maps.Marker({
    position: new google.maps.LatLng(newLoc[0], newLoc[1]),
        map: map,
        title: loc
    });
    google.maps.event.addListener(loc, 'click', function() {
        console.log(loc);
    });
};
我不想在单击地图标记和console.log时生成一堆它们的名称loc。但它们最终都是控制台。记录位置日志中的最后一项

我想这是因为它们的名字都是一样的

这是为什么?我能做些什么?

您需要创建一个。通过创建闭包,您可以在执行时有效地“烘焙”内部函数的状态,这与触发“单击”处理程序的时间不同

编辑:删除了可怕的代码-使用上面Nayjest的更干净的解决方案

您需要创建一个。通过创建闭包,您可以在执行时有效地“烘焙”内部函数的状态,这与触发“单击”处理程序的时间不同


编辑:删除了可怕的代码-使用上面Nayjest的更干净的解决方案

如上所述,您需要关闭:

for (loc in locations){
  (function(loc){  
    var newLoc = locations[loc].split(", ")
    var uniquevar = new google.maps.Marker({
      position: new google.maps.LatLng(newLoc[0], newLoc[1]),
      map: map,
     title: loc
    });

    google.maps.event.addListener(loc, 'click', function() {
      console.log(loc);
    });
  })(loc);
};

如上所述,您需要关闭:

for (loc in locations){
  (function(loc){  
    var newLoc = locations[loc].split(", ")
    var uniquevar = new google.maps.Marker({
      position: new google.maps.LatLng(newLoc[0], newLoc[1]),
      map: map,
     title: loc
    });

    google.maps.event.addListener(loc, 'click', function() {
      console.log(loc);
    });
  })(loc);
};


这段代码中有错误:必须使用loc参数调用logLocation,而不是不带参数立即执行,然后将其传递给google.maps.event.addListenerYeah,完全未经测试的疯狂:将修复这一错误。事件处理程序已经是闭包。实际上,您不希望使用闭包,而是希望调用一个函数并将值作为参数传递,以便它创建一个新的作用域。你仍然有关闭,这就是为什么它不起作用。您的代码应该是:google.maps.event.addListenerloc,'click',logLocationloc。您在任何地方定义的任何函数都是JavaScript中的闭包,因为它可以访问在更高范围内定义的变量,例如事件处理程序可以从for循环访问loc。如果在循环中定义函数,这就是问题所在。但是通过调用函数,您可以创建一个新的执行上下文和一个新的作用域。只有这样,传递给函数的值才会被捕获。请参阅我对另一个答案的评论和我链接到的问题。其他语言可能会以不同的方式处理它,但JavaScript就是这样处理的。在闭包中,更高范围变量的值是在执行函数时计算的,而不是在定义函数时。此代码中存在错误:必须使用loc参数调用logLocation,而不是不带参数立即执行并稍后将其传递给google.maps.event.addListenerYeah,完全未经测试的疯狂:会纠正错误。事件处理程序已经是闭包。实际上,您不希望使用闭包,而是希望调用一个函数并将值作为参数传递,以便它创建一个新的作用域。你仍然有关闭,这就是为什么它不起作用。您的代码应该是:google.maps.event.addListenerloc,'click',logLocationloc。您在任何地方定义的任何函数都是JavaScript中的闭包,因为它可以访问在更高范围内定义的变量,例如事件处理程序可以从for循环访问loc。如果在循环中定义函数,这就是问题所在。但是通过调用函数,您可以创建一个新的执行上下文和一个新的作用域。只有这样,传递给函数的值才会被捕获。请参阅我对另一个答案的评论和我链接到的问题。其他语言可能会以不同的方式处理它,但JavaScript就是这样处理的。在闭包内部,更高范围变量的值是在函数执行时计算的,而不是在定义时。这是在循环中创建闭包的一种非常简洁的方法,比创建单独的函数返回闭包并按我的建议单击调用要简洁得多!同样在这里,这是不正确的。事件处理程序已经是闭包,这就是导致问题的原因。必须调用函数才能创建新的作用域。这就是你对函数loc{…}loc;所做的;。当然,这个函数也是一个闭包,但这不是重点。它解决了这个问题,因为您正在立即调用此函数并将loc作为参数传递。好的,因此真正重要的一点是在每次循环迭代运行时获取loc的值,而不是仅在单击处理程序中对其进行计算,此时循环已经运行,loc只指向最后一个可枚举位置属性。最后一条评论对我来说真的很有意义!除了为什么循环已经运行之外,看看点击处理程序……这是一种在循环中创建闭包的简洁方法——比创建一个单独的函数来返回闭包并按我的建议在点击时调用它要简洁得多!同样在这里,这是不正确的。事件处理程序已经是闭包,这就是导致问题的原因。必须调用函数才能创建新的作用域。这就是你对函数loc{…}loc;所做的;。当然,这个函数也是一个闭包,但这不是重点。它解决了这个问题,因为您正在立即调用这个函数并将loc作为参数传递。好的,所以真正重要的一点是
每个循环迭代运行时loc的值,而不是仅在单击处理程序中对其进行评估,此时循环已经运行,loc仅指向最后一个可枚举位置属性。最后一个注释对我来说非常有意义!除了为什么循环已经运行外,请查看单击处理程序。。。