JS是一个单线程的语言,执行代码时总是先将执行栈内的任务做完才会通过一个事件轮循的方式取查看任务执行队列中有没有事件。有就拿出来执行。
在chrome的控制太粘贴这一段代码
var a = 1; setTimeout(function(){a = 0;}, 30); for(let i = 0; i < 1000; i++){ if(a){console.log(1)} } for(let i = 0; i < 1000; i++){ if(a){console.log(2)} } console.log('a',a)
可以看到他输出了1000次 1 和1000次2,但是这1000次的执行时间是肯定大于了30ms的,但是直到最后打印a, a的值都依然是1。 直到我们手动第二次输入a的时候a的值才变成了0.
由此可见JS是将现有的代码都执行完了才会通过事件轮循机制查看任务队列。