Js
代码在引擎中是'一段一段'的方式来执行的,而非一行一行执行,例如:当执行到一个函数的时候,JS
引擎会做一些准备工作,而这个准备工作,我们称其为执行上下文
,而这一段一段的代码无非的代码就是三种:全局执行上下文,函数执行上下文,eval
执行上下文
函数执行上下文是在函数调用的时候执行的,恰恰与函数作用域相反,函数作用域是在函数定义时候定义的 每个执行上下文都有三个基本概念
- 变量对象(Variable object, VO)
- 作用域链(Scope chain)
- this
变量对象
变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明 因为不同执行上下文下的变量对象稍有不同
作用域链
当查找变量的时候,会从当前的上下文中查找,如果没有找到,就会从父级执行上下文对象中查找,一直找到全局上下文对象。这样有多个上下文的变量对象构成链表叫做作用域链。
this
this
绑定可以分为全局执行上下文和函数执行上下文
- 在全局执行上下文中,
this
指向全局对象,(在浏览器中,this
引用Window
对象) - 在函数执行上下文中,
this
的值取决于函数是如何被调用的。如果它被一个引用对象调用,那么this
被设置成那个对象,否则this
的值被设置为全局对象或undefined
执行过程
执行上下文的代码会分成两个阶段进行处理:分析和执行,我们也可以叫做:进入执行上下文,代码执行
1、进入执行上下文
当进入执行上下文时,这时候还没有执行代码,会做三件事
- 创建作用域
- 创建变量、函数和参数
- 确定
this
的值
2、代码执行
完成对所有变量的分配,最后执行代码。
注:在执行阶段,如果 Javascript
引擎在源代码中声明的实际位置找不到 let
变量的值,那么将为其分配 undefined
值。