javascript - 匿名函数中循环内的变量范围

标签 javascript google-maps anonymous-function

我正在尝试在 Google map 中创建交互式标记。这是创建标记的数组:

var markers = [
    {"id":17,"ti":"33 Star Hotel","lat":3.14648,"lng":101.711,"ty":5,"lid":"3","desc":""},
    {"id":9,"ti":"Aquaria KLCC","lat":3.15392,"lng":101.713,"ty":10,"lid":"3","desc":""},
    {"id":28,"ti":"Batu Ferringhi","lat":5.47436,"lng":100.247,"ty":15,"lid":"4","desc":""},
];

如果标记位置 ID lid 等于 n,则标记将添加到 map n

当单击标记时,我希望显示标记数组索引,但它们都显示i的最终值(markers.length)。

function map_center(n) {
    for ( var i = 0; i < markers.length; i++ ) {
        if ( markers[i].lid == n ) {
            var m = new google.maps.Marker({
                position: { lat: markers[i].lat, lng: markers[i].lng },
                map: map,
                title: markers[i].ti,
                icon: icons[markers[i].ty],
            });
            m.addListener( "click", function(){
                alert("click:" + i );
            });
            markers[i].dom = m;
        }
    }
}

不知何故,匿名函数需要一个参数来获取i当前值的副本。我在 SO 上找到了这个解决方案并且它有效,但我不喜欢以这种方式传递参数:

var m = new google.maps.Marker({
    position: { lat: markers[i].lat, lng: markers[i].lng },
    map: map,
    title: markers[i].ti,
    icon: icons[markers[i].ty],
    i: i
});
m.addListener( "click", function(){
    alert("click:" + this.i );
});

这应该如何正确完成?

最佳答案

将所有内容包裹在 iife 中

function map_center(n) {
for ( var i = 0; i < markers.length; i++ ) {
    (function(i) {
        if ( markers[i].lid == n ) {
            var m = new google.maps.Marker({
                position: { lat: markers[i].lat, lng: markers[i].lng },
                map: map,
                title: markers[i].ti,
                icon: icons[markers[i].ty],
            });
            m.addListener( "click", function(){
                alert("click:" + i );
            });
            markers[i].dom = m;
        }
    })(i)
}

关于javascript - 匿名函数中循环内的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836557/

相关文章:

javascript - 单元测试 Javascript 匿名函数

java - java中有类似javascript绑定(bind)的函数吗

javascript - 如何根据值的变化修改D3js图表?

javascript - 在 V8 的 Array.sort 中使用插入排序而不是希尔排序的理由是什么

javascript - 运行服务器端 Javascript

javascript - JQuery中点击按钮后如何返回函数的值?

ios - Google map URL 方案不适用于 iOS 9

android - Google map Activity 无法启动

javascript - 在 Chrome 设备模式下拖动结束之前,Google map 拖动事件不会捕获中心更改

javascript - jQuery 匿名函数 - 嵌套函数