执行上下文

执行上下文是评估和执行 JavaScript 代码的环境的抽象概念

类型

  • 全局执行上下文
1
2
它创建会执行两件事:创建一个全局的window对象,
并设置this的值等于这个全局的对象。一个程序只会有一个全局对象
  • 函数执行上下文
1
2
每个函数都有它自己的执行上下文,不过是在函数被调用时创建的;
this的值取决于该函数是怎样被调用的,如果是被一个对象引用调用,指向这个对象,否则指向全局对象
  • Eval 函数执行上下文
1
执行在 eval 函数内部的代码也会有它属于自己的执行上下文

执行顺序

当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。

引擎会执行那些执行上下文位于栈顶的函数。当该函数执行结束时,执行上下文从栈中弹出,控制流程到达当前栈中的下一个上下文。

作用域

作用域决定这个变量的生命周期及其可见性。 当我们创建了一个函数或者 {} 块,就会生成一个新的作用域

作用域链

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