我有一个代码示例
for(var i = 0; i < 3; i++) {
setTimeout() {
console.log("i " + i)
}
}
这是在控制台上打印3次“ 3”。但是,我希望它在不使用let的情况下打印“ 0,1,2” 。
到目前为止,我已经尝试了以下方法-
var funcs = [];
function createfunc(i) {
return function() {
console.log("i ", i)
}
}
for(var i = 0; i < 3; i++) {
setTimeout(() => {
funcs[i] = createfunc(i) // statement 1
}, 1000)
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
如果我按原样使用语句1而不将其放入setTimeout函数中,则此方法工作正常。但是,如果我使用setTimeout函数,它将引发错误。有人可以让我知道如何使用setTimeout函数在控制台上打印0、1、2吗?
答案 0 :(得分:2)
由于closure会发生这种情况,无论如何您都可以使用下面的代码,然后您将获得想要的正确结果。
for(var i = 0; i < 3; i++) {
((i) => {
setTimeout(() => {
console.log("i " + i)
}, 0);
})(i);
}