JS采用单线程模式工作的原因
JavaScript单线程原因与它最早的设计初衷有关,最早JavaScript这门语言是一门运行在浏览器端的语言。他的目的是为了实现页面的动态交互。实现页面交互的核心是DOM 操作,这就决定了他必须使用单线程模型否则就会出现非常复杂的线程同步问题。假如有多个线程同时工作,某一线程修改了DOM元素,另外一个线程又删除了这个元素,此时浏览器就无法明确该以哪个线程为准,为了避免线程同步的问题JavaScript开始就设计成了单线程工作。
优点:更安全,更简单
缺点:遇到耗时的任务会阻塞运行,为了解决这个问题JavaScript将代码的执行分为了两种同步模式、异步模式。
同步模式:
- 代码中的任务依次执行,后一个任务等待前一个任务结束后执行
异步模式:
- 不会去等待这个任务的结束才开始下一个任务
- 开启过后就立即往后执行下一个任务
- 后续逻辑一般会通过回调函数的方式定义
Event Loop
- 监听调用栈和消息队列,调用栈所有的任务都结束了事件循环就会从消息队列取出第一个回调函数压入调用栈
消息队列
- 消息队列相当于一个待办的工作表,是暂时存放异步任务的地方,等到同步代码执行完毕以后,eventloop会从消息队列中依次取出异步任务放到调用栈中再次执行。
宏任务
setTimeout、 setInterval
微任务
Promises、Object.observe, MutationObserver
微任务会在本轮的调用结束后执行,宏任务会进入回调队列的末尾
回调函数
- 异步编程的方案根基
Promise
- Promise 对象的then方法会返回一个全新的Promise对象
- 后面的then方法就是在为上一个then返回的Promise注册回调
- 前面then方法中回调函数的返回值会作为后面then方法回调的参数
- 如果回调中返回的是Promise,那后面then方法的回调会等待它的结束(后面的then方法就相当于为所返回的Promise注册了对应的回调)
Generator
Asunc / Await 语法糖
- 语言层面的异步编程标准