聊聊js函数执行时机。下面用一段代码举例说明。
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
上面这段代码的结果是如下图,打印出6个6。
这里需要先理解函数setTimeout(()=>{},0),它的意思是执行完当前的事件后再立即执行它内部的内容。举个生活中案例就是当你现在正在看完这篇博客,你的小伙伴提醒看完之后要记录一下心得,那么你会接着把这篇博客读完,然后再去简单写一个心得,而不是马上放下博客阅读就去写心得。
然后**说回我对上述代码理解,**因为i声明在最上面,属于全局变量,for循环来引用它将它和for循环联系成一个整体,而setTimeout函数在这里的意图是执行完当前的事件后再执行它内部的内容,即整个for循环执行完再打印出i,并且是打印6次。
所以上述代码结果即是,首先执行完整个for循环,循环结束后i会变成6,然后执行6次打印出i时,结果为6个6。
下面展示与上述相似代码,但是会打印为0,1,2,3,4,5,的代码
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
结果如图,说说我的理解。let在for循环中声明,所以为局部变量,使得每次setTimeout()当下要换成的事件即为执行完循环内的本次内容,所以执行完此次循环后马上打出i,然后再i++,所以此处打印出0到5。此解释存疑,我记录自己的理解,后续有更深入了解会更新。
下面我由上述代码简单变型,但是会打印为0,1,2,3,4,5,的代码。
将全局i的值赋给局部变量a,每次打印a,每次循环重新新建a。