我搜索但找不到这个看似简单的问题的答案,所以......
假设我有一个循环,我需要设置回调。我的回调函数如下所示:
function callback(var1) { // code }
现在我的循环是这样的:
for( //condition)
{
var x = something_different_each_time;
document.getElementById('foo').addEventListener('click', function() { callback(x); }, false);
}
现在看起来即使循环运行n次,匿名函数也只编译一次 - 因此每次调用回调都会使用相同的参数调用(即使每次循环中x都有变化)。
我必须在这里遗漏一些东西..非常感谢任何帮助! :)
答案 0 :(得分:2)
答案 1 :(得分:2)
问题是for
语句的块不会创建新范围,因此,x
变量属于其封闭范围,并且所有匿名函数都引用相同的变量...
使用另一个函数创建一个新的词法环境,以便在每次迭代时保持x
的值:
for(/*condition*/) {
var x = something_different_each_time;
document.getElementById('foo').addEventListener('click', function () {
return function(y) {
callback(y);
};
}(x), false);
}
答案 2 :(得分:1)
你应该在调用回调函数之前计算x!
for( //condition)
{
//var x = something_different_each_time;
document.getElementById('foo').addEventListener('click', function() {
var x = something_different_each_time;
callback(x); }, false);
}
答案 3 :(得分:0)
是的,x
将引用封闭范围中的相同变量,并且由于该函数稍后执行,因此它的最后一个值为x
。试试这个:
.addEventListener(
'click',
(function (i) {
return function () { callback(i); }
})(x),
false
);
这会创建一个闭包,当前值x
锁定在其中。