- 在for循环中使用var
for(var i = 0;i<2;i++){
setTimeout(()=>{console.log(i)})
}
上面的代码输出两个2,原因是for循环属于同步,setTimeout属于异步,同步代码执行完才会去执行异步,也就是上面代码每次循环都会项任务队列里加一个定时器,等for循环结束后开始执行,这时候的i是2,所以会打印出两个2。在for循环中用var就是一个全局的i,所以每次会被后面的给替换
- 在for循环中使用let
for(let i = 0;i<2;i++){
setTimeout(()=>{console.log(i)})
}
2中的代码最后打印出的是0,1。因为for循环中使用let循环几次就会生成几个i,也就是说在每次进入循环的时候都会把之前的i赋值给一个新的i
- 在for的表达式中使用异步
需要提前说明的知识
let i = 0,1
//等价于
let i = (0,1)
上面的代码结果都是1,对于逗号表达式如果你有一连串的操作,那么这个表达式的值就是最后一个
典型例题
for(let i = (setTimeout(()=>{console.log(i)},233),0);
i<2;
i++
){
console.log(i)
}
上面的setTimeout里的i又是什么?
答:0;
解释:
2中说了每次进入循环前都会生成一个新的i,这个i就是在初始化表达式后,条件表达式前生成的,也就是说在判断这个i的值之前就已经生成了一个新的i了,这个新的i要不就是初始值要不就是上一次循环的i的值,再次以2中的代码来解释,就相当于
for(let i = 0;let i = _i
, i<2;i++){
setTimeout(()=>{console.log(i)})
}
上面的代码,一开始i=0,然后把这个0赋值给一个新的i,再去判断i是否小于2,如果小于2就进入循环,得到0,然后把这个0进行++得到一个1,再次把这个1赋值给一个新的i,判断是否小于2,小于2进入循环得到1,然后1在++得到一个2,把这个2赋值给一个新的i,这个时候不小于2退出循环
所以这个典型例题里面的初始化表达式的i跟后面的i没有关系,只是它的值会复制给后面的i,所以最后还是0
网友评论