作用域、作用域链

概念

域:指的是“范围,区域”。怎么理解呢?在漫画《海贼王》中,劳的 room 可以操作某一个空间范围的物体转移,但是在 room 以外是不可以的。

在 JavaScript 中, 作用域分为全局作用域和局部作用域。

作用域链

在 JavaScript 中, 函数存在一个隐式属性[[scopes]],这个属性用来保存当前函数在执行时的环境(上下文), 由于在数据结构上是链式的, 也被称为作用域链. 我们可以把它理解成一个数组。

1
2
3
function a() {}

console.dir(a) // 打印内部结构

[[scopes]]属性需要注意:

  1. [[scopes]]属性在函数声明时产生, 在函数被调用时更新
  2. [[scopes]]属性记录当前函数的执行环境

[[scopes]]属性是一个数组的形式
0: 是函数b的AO对象
1: 是GO对象

作用

在访问变量或者函数时, 会在作用域链上依次查找。通过这种特性,内部函数可以使用外部函数的变量,外部函数不能使用内部函数的变量。

参考

  1. https://zhuanlan.zhihu.com/p/297738157