对JS上下文栈和作用域链的理解
什么是执行上下文?
简而言之,执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。
JavaScript三种执行上下文类型
- 全局执行上下文
这是默认或者说基础的上下文,任何不在函数内部的代码都在全局上下文中。只有一个。
它会执行两件事:1.创建一个全局的 window 对象(浏览器的情况下)2.设置 this 的值等于这个全局对象。
一个程序中只会有一个全局执行上下文。 2. 函数执行上下文
每当一个函数被调用时, 都会为该函数创建一个新的上下文。
每个函数都有它自己的执行上下文,不过是在函数被调用时创建的,每次调用的函数都会创建一个新的执行上下文。
函数上下文可以有任意多个。 3. Eval 函数执行上下文
执行在 eval 函数内部的代码也会有它属于自己的执行上下文,但由于 JavaScript 开发者并不经常使用 eval,所以在这里我不会讨论它。
上下文栈
- 在全局代码执行前,JS就会创建一个栈来储存管理所有的执行上下文对象
- 在全局执行上下文后,压栈
- 在函数创建后,压栈
- 在函数执行完后,出栈
- 在所有的代码执行完后,栈中只剩window(全局上下文)
- 全局上下文在浏览器窗口关闭后出栈
作用域
作用域是一个函数在执行时期的执行环境。
可以理解为:每一个函数在执行的时候都有着其特有的执行环境,ECMAScript标准规定,在javascript中只有函数才拥有作用域。也就是说,JS中不存在块级作用域。
作用域链
首先从当前位置开始查询,如果当前位置没有,则继续向上级作用域查询,直到到达全局作用域为止。
← 单行文本溢出省略展示 this指向→