我怎么传递的价值(不准)的JS变为一个功能?[重复]
-
24-09-2019 - |
题
这个问题已经有一个答案在这里:
这是一个简化版本的东西,我正在尝试运行:
for (var i = 0; i < results.length; i++) {
marker = results[i];
google.maps.event.addListener(marker, 'click', function() {
change_selection(i);
});
}
但我发现,每一个监听器使用价值的结果。长(价值时,对于循环终止).我怎么可以添加的听众,这样,每个使用价值我的时候我加入它,而不是参照我?
解决方案
在现代浏览器,可以使用 let
或 const
关键词,以创建一个框范围的变量:
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);
});
}
我没有测试过它虽然。
不隶属于 StackOverflow