You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
单线程是必要的,也是 Javascript 这门语言的基石。在最初的浏览器执行环境中,我们需要进行各种各样的 DOM 操作。如果 Javascript 是多线程的话,当两个线程同时对 DOM 进行一项操作,比如一个向其添加事件,另一个删除了这个 DOM 元素,此时该如何处理呢?因此,Javascript 选择只用一个主线程来执行代码,这样就保证了程序执行的一致性。
JavaScript 特点
JavaScript 是单线程非阻塞的一门语言。
单线程意味着 JavaScript 代码执行时只有一个主线程去处理所有的任务,即同一时间只能做一件事情。
非阻塞表示当执行到异步任务时,主线程会挂起该异步任务,待异步任务返回结果时,再根据一定的规则去执行相应的回调。
事件循环(Event Loop)
JavaScript 是通过「事件循环」的实现非阻塞的。而事件循环是通过「任务队列」机制协调的。
在事件循环中,每进行一次循环操作称为 Tick,每一次 Tick 的任务处理是比较复杂的,主要步骤如下:
Tick 需要了解的是:
宏任务(Task)
每次执行栈的代码就是一个宏任务(包括每次从事件队列中获取的一个事件回调并放到执行中执行)。
浏览器为了能够使得 JS 内部宏任务与 DOM 任务有序地执行,会在宏任务执行结束之后,在下一个宏任务开始执行之前,对页面进行重新渲染。
常见宏任务有:
setInterval
setTimeout
setImmediate
(node.js)微任务(Microtask)
当前同步任务执行结束之后,在下一个宏任务之前(也在渲染 DOM 之前),立即执行的任务。
常见微任务包括:
then
、catch
、finally
回调。process.nextTick
(node.js)MutationObserver
Object.observe
(已废弃)运行机制
References
The text was updated successfully, but these errors were encountered: