不要在循环中创建函数/不确定代码是什么意思

时间:2012-12-06 16:46:05

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

  

可能重复:
  How to get around the jslint error ‘Don’t make functions within a loop.’

公平警告,我非常喜欢初学者。我正在开发一个谷歌地图api v3项目(http://jsbin.com/ofepet/9/edit),我在JSBin上有一个“不要在循环中创建函数”警告。我想修复它,但我正在使用我在其他地方获得的代码,所以我很难理解到底发生了什么 - 特别是最后7行。

简而言之,我不太了解代码,无法将函数从循环中取出。错误出现在倒数第二行。

  function setMarkers(map, markers) {

    for (var i = 0; i < markers.length; i++) {
        var sites = markers[i];
        var siteLatLng = new google.maps.LatLng(sites[1], sites[2]);
        var marker = new google.maps.Marker({
            position: siteLatLng,
            map: map,
            title: sites[0],
            zIndex: sites[3],
            html: sites[4],
            icon: featureImage
        });

        var contentString = "Some content";

        google.maps.event.addListener(marker, "click", function () {
            infowindow.setContent(this.html);
            infowindow.open(map, this);
        });
    }

如何解决此错误?

1 个答案:

答案 0 :(得分:2)

警告实际上正是在说明它的含义。 :-)你有一个for循环,并且在for循环中你创建了一个传递给addEventListener的函数。这经常(虽然不总是)是一个错误,这就是它被标记的原因。

在你的情况下,它实际上是无害的 - 但看起来你可以只为你在循环中创建的所有元素使用一个函数而不是多个。所以:

function setMarkers(map, markers) {

    for (var i = 0; i < markers.length; i++) {
        var sites = markers[i];
        var siteLatLng = new google.maps.LatLng(sites[1], sites[2]);
        var marker = new google.maps.Marker({
            position: siteLatLng,
            map: map,
            title: sites[0],
            zIndex: sites[3],
            html: sites[4],
            icon: featureImage
        });

        var contentString = "Some content";

        google.maps.event.addListener(marker, "click", handler);
    }

    function handler() {
        infowindow.setContent(this.html);
        infowindow.open(map, this);
    }
}

现在,您只需在每次调用setMarkers时创建一个函数并重复使用它。