概览

  • 1.JavaScript从编译到执行过程分四步:
  • 2.在上下文创建以后,并不会立即执行JS代码,而是会先进行一个预编译的过程。
  • 3.预编译分为两种:面试题中的函数提升相关代码题原理。
  • 4.浏览器线程:
  • 5.同步与异步执行顺序:
  • 6.Event Loop执行过程:


1.JavaScript从编译到执行过程分四步:

  • 1-1.词法分析:将字符流转换为记号流,就像英文句子一个个单词独立翻译。
  • 1-2.语法分析:js引擎判断检查你的代码是否存在语法错误,得到语法树。
  • 1-3.预编译:js引擎会在解释javaScript代码之前对其进行编译,编译阶段中的一部分工作就是找到所有的声明,并用适合的作用域将它们关联起来。
  • 1-4.解释执行:从上到下逐行解析代码

2.在上下文创建以后,并不会立即执行JS代码,而是会先进行一个预编译的过程。

  • 2-1.预编译只管变量、形参、函数等,并不会处理return、if等代码逻辑判断。

3.预编译分为两种:面试题中的函数提升相关代码题原理。

  • 3-1.全局的预编译:
  • ①页面加载完成时执行。
  • ②分3个步骤:
  • α:创建GO对象(Global Object)全局对象。
  • β:找变量声明,将变量名作为GO属性名,值为undefined。
  • γ:查找函数声明,函数名作为GO属性,值赋予函数体。
  • 3-2.函数的预编译:
  • ①函数执行前执行。
  • ②分四步:
  • α:创建AO对象(Activation Object)执行期上下文。
  • β:找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。
  • γ:将实参值和形参统一。(将实参值赋值给形参)。
  • δ:在函数体里面找函数声明,函数名作为AO属性名,值赋予函数体。

4.浏览器线程:

  • 4-1.GUI渲染线程:
  • 4-2.JS引擎线程:
  • 4-3.事件触发线程:
  • 4-4.定时器触发线程:
  • 4-5.HTTP请求线程:
  • 4-6.Event Loop事件循环处理线程:

5.同步与异步执行顺序:

  • 5-1.所有同步任务都在主线程上执行,形成一个执行栈 (Execution Context Stack)。异步任务首先到Event Table进行回调函数注册。
  • 5-2.当异步任务的触发条件满足,将回调函数从Event Table压入Event Queue中。
  • 5-3.主线程里面的同步任务执行完毕,系统会去Event Queue中读取异步的回调函数。
  • 5-4.只要主线程空了,就会去Event Queue读取回调函数,这个过程被称为Event Loop。

6.Event Loop执行过程:

  • 6-1.代码开始执行,创建一个全局调用栈,script作为宏任务执行。
  • 6-2.执行过程过同步任务立即执行,异步任务根据异步任务类型分别注册到微任务队列和宏任务队列。
  • ①Promise(then、catch、finally)、Async/Await、MutationObserver、Process.nextTick属于微任务。
  • 6-3.同步任务执行完毕,查看微任务队列。
  • ①若存在微任务,将微任务队列全部执行(包括执行微任务过程中产生的新微任务)。
  • ②若无微任务,查看宏任务队列,执行第一个宏任务,宏任务执行完毕,查看微任务队列,重复上述操作,直至宏任务队列为空。