js运行机制
1、
console.log(1); setTimeout(function(){ console.log(2); },0) console.log(3)
打印顺序:132
为什么是1,3,2
js是单线程,同一时间只能做一件事,setTimeout是个异步任务,异步任务要挂起,放到任务队列,不立即执行,等同步任务处理完之后,再去处理异步任务
2、
console.log('A'); while(true){ } console.log('B');
打印出:A
因为一直在循环,同步任务一直在执行,一直没执行到B
3、
console.log('A'); setTimeout(function(){ console.log(2); },0) while(true){}
因为while这个同步任务一直没执行完,执行不到异步队列
4、
for(var i=0; i<4; i++) { setTimeout(function(){ console.log(i) },1000) }
打印出:4 4 4 4
因为for循环是个同步任务,遇到setTimeout,这个时间是1000,定时器会记住这个语句,但是他并没有去执行,i就+1了,这个时候还没有执行,交给了定时器了,for循环执行完了,到时间了,定时器会把这个setTimeout扔到异步队列中,这个时候就开始执行了。
5、什么是EventLoop(事件循环)
一开始浏览器遇到setTimeout,然后交给了定时器,定时器先自己留着,然后等同步任务执行完后,这个setTiemout扔到了异步任务,然后按顺序放到运行栈中执行,运行栈执行完,再去拿异步任务,这个不断循环的过程,就是eventloop(事件循环)