JS执行原理

80 阅读2分钟

初始化全局对象

自用笔记

初始化全局对象(GO)和 执行上下文(EC)

var num1=1
var num1=2
var result=num1+num2
console.log(result)

初始化全局对象(GO)

JS引擎在解析代码的时候,会在堆内存中创建一个全局对象叫:Gobal Object (GO)

  • 该对象所有作用域都可以访问
  • 会包含Date Array String Number setTimeout setInterval
  • 并会创建一个windows属性指向本身

image.png

执行上下文

代码运行时:js引擎(这里考虑V8引擎)会创建执行上下文栈(Execution context stack)简称ECS,它就是执行代码的调用栈

这个文章解释的ECS很清楚:juejin.cn/post/719474…

执行上下文分为:全局执行上下文(GEC)和 函数执行上下文(FEC)

全局执行上下文(GEC)

全局作用域执行时会被分为两部分:

  1. 解析代码,即parse转成AST的过程中:全局定义的变量放入初始化全局对象(GO),但是不会赋值,目前只是在解析阶段。这个过程也被叫做变量的作用域提升
  2. 执行代码:此时为GO中的变量赋值,或者执行其它函数 image.png

函数执行上下文(FEC)

当js引擎遇到函数执行时,会创建一个 函数执行上下文( Functional Execution Contex )  简称FEC,并压入到执行上下文栈ECS

FEC中包含三部分内容: 1、VO(variable object)对象,其实也是AO(Activation Object)
2、作用域链:由自己的VO+父级的VO,查找时会一层一层去查找
3、this绑定

作用域: 解析编译时就已经决定了,不是在执行调用的时候

var message = "Global"
function foo() {
  console.log(message)
}
function bar() {
  var message = "Bar"
  foo()
}
bar()

分析这段代码:参考:juejin.cn/post/712906…
(此时需要理解出入栈的内容,参考:juejin.cn/post/719474…

本篇文章中,涉及的内容: 1、ECS 2、GEC 3、FEC 4、VO 5、VE 6、GO 7、AO