参考连接:
这一次,完全弄懂 JavaScript 执行机制
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理javascript
JavaScript引擎是单线程运行的,浏览器不管在何时都只且只有一个线程在运行JavaScript程序.浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。这些异步线程都会产生不一样的异步的事件.html
程序中跑两个线程,一个负责程序自己的运行,做为主线程 main thread
; 另外一个负责主线程与其余线程的的通讯,被称为“Event Loop 线程" 。每当遇到异步任务,交给 EventLoop 线程,而后本身日后运行,等到主线程运行完后,再去 EventLoop 线程拿结果。html5
1)全部任务都在主线程上执行,造成一个执行栈(execution context stack)。java
2)主线程以外,还存在一个"任务队列"(task queue)。系统把异步任务放到"任务队列"之中,而后继续执行后续的任务。浏览器
3)一旦"执行栈"中的全部任务执行完毕,系统就会读取"任务队列"。若是这个时候,异步任务已经结束了等待状态,就会从"任务队列"进入执行栈,恢复执行。数据结构
4)主线程不断重复上面的第三步。多线程
"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当异步任务从"任务队列"回到执行栈,回调函数就会执行。"任务队列"是一个先进先出的数据结构,排在前面的事件,优先返回主线程。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动返回主线程。异步
主线程从"任务队列"中读取事件,这个过程是循环不断的,因此整个的这种运行机制又称为Event Loop。
Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制。JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题。函数
javascript是单线程的,这个线程中拥有惟一的一个事件循环。
JavaScript代码的执行过程当中,除了依靠函数调用栈来搞定函数的执行顺序外,还依靠任务队列(task queue)来搞定另一些代码的执行。
一个线程中,事件循环是惟一的,可是任务队列能够拥有多个。
运行机制以下:oop
Tasks, microtasks, queues and schedules
setTimeout:在指定的毫秒数后,将定时任务处理的函数添加到执行队列的队尾。
setInterval:按照指定的周期(以毫秒数计时),将定时任务处理函数添加到执行队列的队尾。
从主线程的角度看,一个异步过程包括下面两个要素:
它们都是在主线程上调用的,其中注册函数用来发起异步过程,回调函数用来处理结果。
例如setTimeout(fn, 1000),其中的setTimeout就是异步过程的发起函数,fn是回调函数。用一句话归纳:工做线程将消息放到消息队列,主线程经过事件循环过程去取消息。