1
let 是块级作用域,每次输出的时候要找的i不是同一个i,是各自块作用域的i,是不同的i,在第一个块作用域里i的值是0,第二个是1,以此类推,所以第一个console出来的值是不同的,是0 1 2 3 4
当单独的输出语句输出i的时候,它的作用域并没有i,所以它会报错,所以第二个console出来的值是 i is not defined
最后结果是 0 1 2 3 4 i is not defined
2
var 的时候是在同一个作用域里,每次输出的i是同一个i,这个i的值在变,所以输出也在变,所以第一个console结果是0 1 2 3 4
var单独输出的i和for循环的i是同一个作用域,因为i最后变成了5,所以第二个console结果是5.
最后结果是 0 1 2 3 4 5
3
由于var定义变量时,变量是被定义在当前作用域里的,setTimeout是异步,要在for循环后执行,所以当settineout函数执行的时候,输出变量i时,会从当时作用域里面去找变量i,总共进行了5次查找,这5次查找都是在当前作用域执行的,所以它们找到的是当时作用域下的同一个i,这个i是5,所以结果是5个5
最后结果是1s后 5 5 5 5 5
4
let是块级作用域,每执行一次setTimeout就向每个块中寻找i值,执行了5次,每个块中分别是0 1 2 3 4,所以结果为0 1 2 3 4
最后结果是1s后 0 1 2 3 4
5
setTimeout是异步,所以要等for循环后执行setTimeout,for循环执行了5次,结果是5,所以先console外边的一个5,1秒后输出5个5.
最后结果是5 过1s后5 5 5 5 5
6
setTimeout是异步,所以要等外边的console执行完后再执行setTimeout,当外边的输出语句输出i的时候,它的作用域并没有i,所以它会报错,所以console出来的值是 i is not defined,由于js是单线程,所以setTimeout就不会执行,所以最后结果是 i is not defined