JS-作用域

作用域

每一个变量、函数都有其作用的范围,超出作用不得使用

作用域链

  1. 函数被创建或者被定义的时候,函数对象有一个内部属性 [[scope]]**,它引用了一条作用域链**,也可以理解为对象列表
  1. 在函数 a 创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量
  2. 执行 a函数的时候,会创建一个该函数的执行期上下文的内部对象
  3. 当这个执行期上下文被创建时,他的作用域链会被初始化为当前执行的函数对象里的**[[scope]]属性中所包含的对象**
  4. 然后解释器创建一个活动对象,这个活动对象包含当前这个执行函数里所有的局部变量(内部var 声明的),命名参数(形参),参数合集(arguments)以及this
  5. 然后此活动对象会被推入执行期上下文里作用域链的前端
  6. 当函数执行完毕,该执行期上下文就会被销毁

img

作用域链的作用

  • 用于解析标识符
    • 函数执行上下文被创建好之后,解释器开始自上至下的解释代码了,这时每遇到一个标示符,都会遍历这个执行上下文里的作用域链
      • 首先在最顶层的活动对象里去找,如果没找到,再找下一层,最终找到全局作用域
      • 如果还没找到一般会报语法错误;但是当对未定义的变量执行赋值运算时,解释器会在全局作用域创建该变量并赋值。这一点很重要,编程时要小心,防止污染全局环境,或者造成内存泄露的问题