为便于理解,在进入正题以前,不得不说如下一些基本的概念。前端
是操做系统结构的基础;linux
是系统进行资源分配和调度的基本单位;面试
在linux系统中可使用ps-ef
来查询进程列表(以下图)。比进程更小的单位叫作线程
。 promise
是操做系统可以进行运算调度的最小单位;浏览器
它被包含在进程之中,是进程中的实际运做单位;一个进程能够并发
多个线程,每条线程并行
执行不一样的任务。并发
先进后出
的原则。以上咱们讲到了进程与线程
,同步与异步
,执行栈
,主线程
等,那么JS究竟是怎么运行的呢?异步
先来供上一个常见面试题,写出如下代码的执行结果async
console.log('start')
setTimeout(() => {
console.log('setTimeout')
}, 0)
new Promise(resolve => {
console.log('promise')
resolve()
}).then(() => {
console.log('then1')
}).then(() => {
console.log('then2');
})
console.log('end')
复制代码
结果以下图:函数
为何setTimeout最后输出呢???oop
JS代码的执行其实就是往执行栈中放入函数。那么遇到异步代码的时候该怎么办呢?其实当遇到异步代码时,会被挂起并在须要执行的时候加入到任务队列
。一旦执行栈为空,Event Loop 就会从任务队列中拿出须要执行的代码并放入执行栈中执行。
JS引擎常驻于内存中,等待宿主将JS代码或函数传递给它,也就是等待宿主环境分配宏观任务,反复等待 - 执行即为事件循环。
Event Loop中,每一次循环称为tick,每一次tick的任务以下:
script
),执行其同步代码直至结束;本文主要介绍了JS运行机制,即Event Loop,及其相关的一系列概念。
若有问题,欢迎指正。