打印数字的问题

有如下代码:

1
2
3
4
5
6
7
let i = 0
for (i = 0; i < 6; i++){
    setTimeout(() => {
        console.log(i)
    })
}
// 打印结果为 6 6 6 6 6 6

???

因为setTimeout函数总是尽快执行内部的代码,即使你定义时间为0,也是尽快。

多快?在循环执行完毕后再执行内部代码。那当然最后读取到的i的值都是6了,i只有在等于6时才会跳出循环。

打印出每一次的数字?

ES6 块级作用域 let

如果你这样修改:

1
2
3
4
5
6
for (let i = 0; i < 6; i++){
    setTimeout(() => {
        console.log(i)
    })
}
// 打印结果为 0 1 2 3 4 5

这样就会打印出 0,1,2,3,4,5 了。

当你在循环中使用 let 声明一个变量,那么在每一次循环结束,都会创建一次该变量并记录最新的值 :)

还有什么方法?

调用外部函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
let i = 0
for (i = 0; i < 6; i++){
    print(i)
}

function print(i) {
    setTimeout(() => {
        console.log(i)
    },0)
}
// 打印结果为 0 1 2 3 4 5