如何使此javascript警报0,1和2而不是3 3?
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(function() {alert(i);}, 1000);
}
我知道它为什么这样做,但我无法弄清楚,如何将i
传递给匿名函数。
答案 0 :(得分:9)
您可以将其包装在一个闭包中,如下所示:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
(function(num) {
window.setTimeout(function() {alert(vals[num]);}, 1000);
})(i);
}
答案 1 :(得分:3)
var vals = [1, 2, 3];
function makeCallback(i)
{
return function () {alert(i);};
}
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(makeCallback(i), 1000);
}
答案 2 :(得分:0)
将i传递给函数并不是绝对必要的,它可以分配给局部var里面。
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
(function() {
var num = i
window.setTimeout(function() {alert(vals[num]);}, 1000);
})();
}
“function(){block}()”是必需的,因为Javascript没有正确的块词法变量。最近的版本添加了“let”,这使得这成为可能:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
let num = i
window.setTimeout(function() {alert(vals[num]);}, 1000);
}