如何使此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
匿名函数。
如何使此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
匿名函数。
您可以像这样在一个封闭包装这个:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
(function(num) {
window.setTimeout(function() {alert(vals[num]);}, 1000);
})(i);
}
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);
}
IT工作,但不是有效的语法'window.setTimeout'需要一个函数参考,不执行代码。 – Tyilo
你甚至不需要返回一个函数,看起来 - 只需发出警报(i)'在makeCallback内部 – Blazemonger
试试吧。 makeCallback返回一个函数引用,所以它会工作。 –
这不是绝对必要的,以我传递给函数,它可以被分配给本地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没有合适的块词法变量。最近的版本增加了“让”,这使这成为可能:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
let num = i
window.setTimeout(function() {alert(vals[num]);}, 1000);
}
不错的工作。我注意到,有时候这些数字会按照1,3,2的顺序发出警报(可能是Chrome 13中运行它的5次之一) –
顺序无关紧要,您不应该依赖setTimeout的顺序或者无论如何setInterval – Tyilo