【发布时间】:2011-07-10 17:21:01
【问题描述】:
我有这个脚本:
for (var i = 1; i <= 2; i++) {
setTimeout(function() { alert(i) }, 100);
}
但是3 两次都收到警报,而不是1 然后2。
有没有办法传递i,而不将函数写成字符串?
【问题讨论】:
-
这里的答案都不起作用。他们每个人都只是延迟设定的时间,然后立即运行整个循环而不会再延迟。查看 OP 的代码,他们显然希望每次迭代都有延迟。
-
另外值得注意的是,如果用户确实希望警报同时触发,那么设置多个
setTimeouts 并不是最好的方法。 -
使用“let”关键字代替var,这样就解决了。
-
我正在尝试类似的事情,但没有人能够从概念上回答这个问题,或者解释我做错了什么。这可能是您需要了解的内容: setTimeout() 是异步的:JS 引擎在继续之前不会等待 n 毫秒(在您的示例中为 100 毫秒)。它只是做了一个“心理记录”:“100 毫秒后,执行(在这种情况下)警报”,然后继续执行循环。它会在 100 毫秒结束之前完成所有 3 次(或 300 次)迭代,因此最终,当该时间过去时,它会一次发出所有 3 次(或 300 次)警报。
-
我认为您可以使用
let而不是var。这将解决您的问题
标签: javascript