JavaScript 单线程起源:
JavaScript 作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM,为了防止复杂性,诞生开始,JavaScript 就是单线程语言。
比方,假设 JavaScript 同时有两个线程,一个线程在某个 DOM 节点上增加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以,为了防止复杂性,从一诞生,JavaScript 就是单线程。
单线程及存在的问题:
单线程就意味着,所有工作须要排队,前一个工作完结,才会执行后一个工作。如果前一个工作耗时很长,后一个工作就不得不始终等着。
问题的解决 – 同步、异步
synchronous(同步工作)和 asynchronousk(异步工作)
- 同步工作是 调用立刻失去后果的工作 ,同步工作在 主线程 上排队执行的工作,只有前一个工作执行结束,能力执行后一个工作;
- 异步工作是 调用无奈立刻失去后果的工作 ,须要额定的操作能力预期后果的工作,异步工作不进入主线程、而进入 ” 工作队列“(task queue)的工作,只有 ” 工作队列 ” 告诉主线程,某个异步工作能够执行了,该工作才会进入主线程执行。
macro-task(宏工作)和 micro-task(微工作)
- 宏工作:macro-task 能够了解是每次执行栈执行的代码就是一个宏工作(包含每次从事件队列中获取一个事件回调并放到执行栈中执行, 每一个宏工作会从头到尾将这个工作执行结束,不会执行其它)包含整体代码 script,setTimeout,setInterval 等
- 微工作:micro-task 能够了解是在以后 task 执行完结后立刻执行的工作 包含 Promise,process.nextTick 等
(未完 …)