Js执行上下文

102 阅读2分钟

执行上下文定义

执行上下文是一个抽象的概念,可以理解为一个对象,函数执行上下文是在函数调用的时候执行的,恰恰与函数作用域相反,函数作用域是在函数定义时候定义的,该对象包含三个基本元素

  • 变量对象(Variable object, VO):

存储了在上下文中定义的变量和函数声明,会把函数和变量作为变量对象的一个属性,变量对象是不可以访问的

  • 活动对象(Activity object, AO):

活动对象是可以访问的,活动对象和变量对象本质是一样的,只是状态不同,阶段不同

  • 作用域链(Scope chain): 作用域链是在函数定义的时候确立的

  • this的确定

执行上下文类型

  • 函数执行上下文
  • 全局执行上下文
  • eval执行上下文

上下文的生命周期

  • 创建阶段

1、检查当前执行环境上的参数列表,建立Arguments对象,并作为outerFun VO的arguments属性值

2、检查当前环境的函数声明,每检查到一个函数声明,就在变量对象中以函数名建立一个属性,属性值则执行函数所在的内存地址

3、检查当前执行环境上的所有var变量声明,没检查到一个var声明,如果VO中已经存在function函数声明则跳过,不存在就在变量对象中以变量名建立一个属性,属性值为undefined,而letconst不会变量提升,注意函数声明会加到变量对象中,而函数表达式会被忽略

4、构建作用域链

5、确定this的值

  • 执行阶段

JS代码开始按顺序执行,在这个阶段JS引擎开始对定义的变量赋值,开始顺着作用域链访问变量、如果内部有函数调用就创建一个新的执行上下文压入执行栈并把控制权交出...

  • 销毁阶段

活动对象销毁,当前执行上下文会从执行栈中弹出,控制权交给执行栈下一层的执行上下文,而当我们使用闭包的时候,他会返回变量对象的的一个属性,导致变量对象无法销毁,除非闭包的引用被销毁,闭包不在引用父函数的变量对象,这块内存才能释放