这个问题已经有一个答案在这里:

这是一个简化版本的东西,我正在尝试运行:

for (var i = 0; i < results.length; i++) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', function() { 
        change_selection(i);
    }); 
}

但我发现,每一个监听器使用价值的结果。长(价值时,对于循环终止).我怎么可以添加的听众,这样,每个使用价值我的时候我加入它,而不是参照我?

有帮助吗?

解决方案

在现代浏览器,可以使用 letconst 关键词,以创建一个框范围的变量:

for (let i = 0; i < results.length; i++) {
  let marker = results[i];
  google.maps.event.addListener(marker, 'click', () => change_selection(i));
}

在旧的浏览器,则需要创建一个独立的范围,可以节省的可变其目前状态下通过它作为一个功能参数:

for (var i = 0; i < results.length; i++) {
  (function (i) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', function() { 
      change_selection(i);
    }); 
  })(i);
}

通过创建一个匿名的功能并呼吁它与变为第一个参数,你们传递的价值的功能和创建一个封闭。

其他提示

以及关闭,可以用 function.bind:

google.maps.event.addListener(marker, 'click', change_selection.bind(null, i));

传递的价值 i 在作为一个参数的函数时调用。(null 是的结合 this, 你不需要在这种情况。)

function.bind 介绍了该原型框架和已经标准化在写第五版。直到浏览器的所有支持它本身,你可以加入你自己的 function.bind 支持使用封闭:

if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        var args= Array.prototype.slice.call(arguments, 1);
        return function() {
            return that.apply(owner,
                args.length===0? arguments : arguments.length===0? args :
                args.concat(Array.prototype.slice.call(arguments, 0))
            );
        };
    };
}

关闭:

for (var i = 0, l= results.length; i < l; i++) {
    marker = results[i];
    (function(index){
        google.maps.event.addListener(marker, 'click', function() { 
            change_selection(index);
        }); 
    })(i);
}

编辑,2013年: 这是现在通常称为 IIFE

你们绕了一个封闭。 这是一篇关于关闭 以及如何与他们合作。检查出一例5月的页面;这是场景你处理。

编辑:四年后,这一链接是死的。问题的根源上面, for 环形式的封锁(具体地上 marker = results[i]).作为 marker 传递到 addEventListener, 你看到副作用的关闭:共享"环境"更新与每一个迭代的循环,在它之前的最后"保存"通过关闭之后的最后的迭代。 MDN说明了这一点非常好。

for (var i = 0; i < results.length; i++) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', (function(i) {
        return function(){
            change_selection(i);
        }
    })(i)); 
}

我认为,我们可以界定一个临时变量储存的价值i。

for (var i = 0; i < results.length; i++) {
 var marker = results[i];
 var j = i;
 google.maps.event.addListener(marker, 'click', function() { 
   change_selection(j);
 }); 
}

我没有测试过它虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top