[TOC]
JS单线程与浏览器多线程
JS是单线程的,但是浏览器内核是多线程的
HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM
浏览器多线程:
- JS引擎线程(JS引擎有多个线程,但是只有一个主线程,其他后台配合主线程)
- UI渲染线程:与JS引擎线程互斥
- 浏览器事件触发线程
- http请求线程:ajax等
- 定时器触发线程
- 事件轮询处理线程:轮询任务队列
异步
异步是浏览器的两个或者两个以上线程共同完成的。比如ajax异步请求和setTimeout
JS的异步是通过回调函数实现的,即通过任务队列,在主线程执行完当前的任务栈(所有的同步操作),主线程空闲后轮询任务队列,并将任务队列中的任务(回调函数)取出来执行。
虽然JS是单线程的但是浏览器的内核是多线程的,在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。
JS异步运行机制: