在循环里面使用setTimeout时有个问题突然想不明白了……

代码如下:

for(var i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i);
    }, i * 1000);
}

突然一下想不明白为什么是每秒输出一次了??

阅读 3.1k
3 个回答

我倒觉得这道题目的核心是闭包,“为啥每次输出都是6”,而不是“每秒输出一次”。

// 把代码改成这样看能不能理解
setTimeout(function timer() {
    console.log(i);
}, 1000);
setTimeout(function timer() {
    console.log(i);
}, 2000);
setTimeout(function timer() {
    console.log(i);
}, 3000);
setTimeout(function timer() {
    console.log(i);
}, 4000);
setTimeout(function timer() {
    console.log(i);
}, 5000);
setTimeout(function timer() {
    console.log(i);
}, 6000);

setTimeout本身是顺序执行的,没有异步这种,所以是1000,2000,3000这种

setTimeout内部的函数是异步的

每一个讲javascript作用域教程都用这个作讲解例程

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进