下面是我正在尝试运行的东西的简化版本:
for (var i = 0; i < results.length; i++) {
marker = results[i];
google.maps.event.addListener(marker, 'click', function() {
change_selection(i);
});
}
但是我发现每个监听器都使用results.length的值( for循环终止时的值)。如何添加侦听器,使每个侦听器在添加时都使用i的值,而不是对i的引用?
发布于 2010-04-03 06:19:35
除了闭包之外,您还可以使用function.bind
google.maps.event.addListener(marker, 'click', change_selection.bind(null, i));
调用时将i
的值作为参数传递给函数。(null
用于绑定this
,在本例中不需要)。
原型框架引入了function.bind
,并在ECMAScript第五版中进行了标准化。在浏览器都支持它之前,您可以使用闭包添加您自己的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))
);
};
};
}
发布于 2014-05-17 23:45:58
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));
}
发布于 2012-06-07 01:20:57
我想我们可以定义一个临时变量来存储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);
});
}
不过我还没有测试过它。
https://stackoverflow.com/questions/2568966
复制相似问题