【问题标题】:Don't Make Functions Within a Loop / Not sure what code means [duplicate]不要在循环中创建函数/不确定代码的含义[重复]
【发布时间】:2012-12-06 16:46:05
【问题描述】:

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

公平的警告,我是一个非常初学者。我正在开发一个 google maps 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);
        });
    }

如何解决这个错误?

【问题讨论】:

  • 除了该问题中的解决方案对于上述用例而言不必要地复杂。此用户不需要为每个循环迭代创建自定义处理程序。

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


【解决方案1】:

警告实际上是准确地说明了它的含义。 :-) 你有一个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 创建一个函数并重用它。

【讨论】:

  • 非常感谢!这很有帮助!
  • @user1876913:很高兴!正如您所说,您是 JavaScript 的新手,我只想指出,上面使用了称为 closure 的东西(handler 函数“关闭”了使用的 map 参数在对创建它的setMarkers 的调用中)。人们对闭包感到困惑,但实际上并不复杂。事实上,我写了一篇名为Closures are not complicated的文章,因为我看到了很多困惑。 :-)
  • 太棒了,我的头开始旋转。我一定会读到这个。感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2011-10-15
相关资源
最近更新 更多