解释函数的执行时机
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
问:为什么会打印出6个6? 首先我们看一下setTimeout()的几个小知识
- setTimeout最快执行时间是4毫秒。
- 使用setTimeout的函数会比当前队列的函数慢执行,在他们的后面。
- setTimeout中的定时器并不是准确的时间,实际中它需要在执行完前面的函数后才定时执行。 由此可以知道在代码中,是先执行完for循环,然后再setTimeout()里面的代码,当for循环执行完后,i最后的值为6,所以就打印输出 6个6
- 一些setTimeout()的知识参考了这篇文章可以看看学习一下关于setTimeout()你所不知道的地方,详解setTimeout()也可以查阅mdn文档学习;
如何打印出0~5?
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 上面代码中,变量
i
是let
声明的,当前的i
只在本轮循环有效,所以每一次循环的i
其实都是一个新的变量. - 可以查看这篇文章学习
let
和var
之间的一些区别let 和 const 命令或者直接查阅mdn文档
其他打印出0~5的方法
另外我在网上找到其他的两种办法来实现这个效果
- 使用
setTimeout
的第三个参数,另外一种是利用闭包(注:在es6之前):
// 第一种方法
for (var i=0; i<6; ++i) {
setTimeout(function(i){
console.log(i)
}, 0, i)
}
// 第二种方法
for(var i=0; i<6; ++i) {
!(function(j) {
setTimeout(function(){
console.log(j)
}, 0)
})(i)
}
参考文档:JS 函数的执行时机(for,let和setTimeout()的结合使用 作者:徒手敲代码;