对JS上下文栈和作用域链的理解

什么是执行上下文?

简而言之,执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。

JavaScript三种执行上下文类型

  1. 全局执行上下文

这是默认或者说基础的上下文,任何不在函数内部的代码都在全局上下文中。只有一个。

它会执行两件事:1.创建一个全局的 window 对象(浏览器的情况下)2.设置 this 的值等于这个全局对象。

一个程序中只会有一个全局执行上下文。 2. 函数执行上下文

每当一个函数被调用时, 都会为该函数创建一个新的上下文。

每个函数都有它自己的执行上下文,不过是在函数被调用时创建的,每次调用的函数都会创建一个新的执行上下文。

函数上下文可以有任意多个。 3. Eval 函数执行上下文

执行在 eval 函数内部的代码也会有它属于自己的执行上下文,但由于 JavaScript 开发者并不经常使用 eval,所以在这里我不会讨论它。

上下文栈

  1. 在全局代码执行前,JS就会创建一个栈来储存管理所有的执行上下文对象
  2. 在全局执行上下文后,压栈
  3. 在函数创建后,压栈
  4. 在函数执行完后,出栈
  5. 在所有的代码执行完后,栈中只剩window(全局上下文)
  6. 全局上下文在浏览器窗口关闭后出栈

作用域

作用域是一个函数在执行时期的执行环境。

可以理解为:每一个函数在执行的时候都有着其特有的执行环境,ECMAScript标准规定,在javascript中只有函数才拥有作用域。也就是说,JS中不存在块级作用域。

作用域链

首先从当前位置开始查询,如果当前位置没有,则继续向上级作用域查询,直到到达全局作用域为止。