下面看一下,这个异步回调函数的执行 var startDate=new Date(); setTimeout(function cb(){ console.log("时间间隔为:",new Date()-startDate+'ms'); },600); while(new Date()-startDate<1000){}; 步骤:
-
1、script入栈,startDate开始初始化 -
2、setTimeout入栈,由于它是异步的,所以出栈被放到webApis中 -
3、while入栈,进入主线程中执行。但是它会阻塞1000ms -
4、600ms过后,webApis将异步函数放到Callback Queue中,等待执行 -
总结:浏览器的事件循环机制: 首先,js是单线程的,但浏览器是事件驱动的,它存在很多异步行为,并为它们开了一个线程。说到浏览器线程,主要有js引擎线程、GUI渲染线程、事件触发线程。其次,js的并发模型是基于浏览器的事件循环机制的。5、400ms过后,while执行完毕,while从栈中弹出,此时栈为空。异步函数setTimeout入栈,开始执行-->出栈。
简单说,浏览器的事件循环机制就是一个程序结构,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。