Js执行上下文

161 阅读2分钟

Js代码在引擎中是'一段一段'的方式来执行的,而非一行一行执行,例如:当执行到一个函数的时候,JS引擎会做一些准备工作,而这个准备工作,我们称其为执行上下文,而这一段一段的代码无非的代码就是三种:全局执行上下文,函数执行上下文,eval执行上下文

函数执行上下文是在函数调用的时候执行的,恰恰与函数作用域相反,函数作用域是在函数定义时候定义的 每个执行上下文都有三个基本概念

  • 变量对象(Variable object, VO)
  • 作用域链(Scope chain)
  • this

变量对象

变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明 因为不同执行上下文下的变量对象稍有不同

作用域链

当查找变量的时候,会从当前的上下文中查找,如果没有找到,就会从父级执行上下文对象中查找,一直找到全局上下文对象。这样有多个上下文的变量对象构成链表叫做作用域链。

this

this绑定可以分为全局执行上下文和函数执行上下文

  • 在全局执行上下文中,this指向全局对象,(在浏览器中,this引用Window对象)
  • 在函数执行上下文中,this的值取决于函数是如何被调用的。如果它被一个引用对象调用,那么this被设置成那个对象,否则this的值被设置为全局对象或undefined

执行过程

执行上下文的代码会分成两个阶段进行处理:分析和执行,我们也可以叫做:进入执行上下文,代码执行

1、进入执行上下文

当进入执行上下文时,这时候还没有执行代码,会做三件事

  • 创建作用域
  • 创建变量、函数和参数
  • 确定this的值

2、代码执行

完成对所有变量的分配,最后执行代码。

注:在执行阶段,如果 Javascript 引擎在源代码中声明的实际位置找不到 let 变量的值,那么将为其分配 undefined 值。