jshint - 不要在循环中创建函数 - google 映射

jshint - Don't make functions within a loop - google maps

我创建了一个带有一些标记的 google 地图(来自 wordpress 帖子),但是当我在控制台上 运行 "gulp" 时出现此错误:"Don't make functions within a loop."

我创建了一个 jsfiddle 来复制我的本地主机情况,有人可以帮我解决这个问题吗?

我知道如果我写“// jshint ignore:line” gulp 创建脚本,但我认为这个问题可能是我在 chrome :(

var infowindow = new google.maps.InfoWindow();
var gmarkers = []; 

function initialize() {
  map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: new google.maps.LatLng(51.508293, -0.127701),
    mapTypeControl: false,
    panControl: false,
    zoomControlOptions: {
        position: google.maps.ControlPosition.RIGHT_CENTER
    },
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  for (var i = 0; i < locations.length; i++) {
    var marker = new google.maps.Marker({
      position: locations[i].latlng,
      icon: locations[i].marker,
      map: map,
      animation: google.maps.Animation.DROP,
      optimized : false
    });

    gmarkers.push(marker);

    google.maps.event.addListener(marker, 'click',
      (function(marker, i) {
        return function() {
          map.panTo(marker.getPosition());

          //method 2
          var target = jQuery("#item" + i);
          jQuery(target).show().siblings("div").hide();

          if (!jQuery('#all-posts').hasClass('active')){
            jQuery("#all-posts").toggleClass("active");
            jQuery("#close-btn").toggleClass("active");
          }

          // stop yt video
          //jQuery("#stop-yt-video").trigger("click");
        };
      })(marker, i)
    );  
  }
}

initialize();

使用你的 IIFE 函数,将其移出循环并为其命名,例如 makeHandler (但不要调用它).

function makeHandler(marker, i) {
  return function() {

    map.panTo(marker.getPosition());

    //method 2
    var target = jQuery("#item" + i);
    jQuery(target).show().siblings("div").hide();

    if (!jQuery('#all-posts').hasClass('active')){
          jQuery("#all-posts").toggleClass("active");
          jQuery("#close-btn").toggleClass("active");
    }
    // stop yt video
    //jQuery("#stop-yt-video").trigger("click");
  };
}

然后在循环中,这样做:

for (var i = 0; i < locations.length; i++) {
  var marker = new google.maps.Marker({
    position: locations[i].latlng,
    icon: locations[i].marker,
    map: map,
    animation: google.maps.Animation.DROP,
    optimized : false
  });
  gmarkers.push(marker);

  google.maps.event.addListener(marker, 'click', makeHandler(marker, i)); 
}