len最后是0但为什么定时器打印出-1呢,完全不懂希望得到解答谢谢
你没发现打印了5次 -1吗?setTimeout(()=>{},0)这也是一个很经典的面试题,考点是同步异步以及js的宏任务和微任务。当然这里可以理解简单点,就是js基于事件循环机制执行的,优先执行同步任务,异步任务会存放在任务队列里面,等同步执行完毕后再去执行异步。这里的setTimeout就是异步,当执行到这里的时候会将起存放(这里存放的是整个执行逻辑(len--)),继续执行while里面的同步任务。所以等同步任务执行完毕后(执行了5次),此时任务队列里面也就有了5个等待执行的异步任务,现在就开始执行异步任务了,此时len已经是0了,所以结果就是5次 -1。这里要说明一下,异步任务不会相互干扰,每个异步拿到的都是0.
let len=5;
while(len--){
console.log(len)
setTimeout(()=>{
console.log(len,"999")
})
}
这样你会 发现 最后才运行的 定时器 里面的输出 。
因为 setTimeout是 异步事件 。 上面的是主线程 ,走完主线程 才走 异步任务。
这个是事件循环