执行环境及作用域

执行环境 execution context

  • 每个执行环境都有一个变量对象 variable object,保存了该环境中定义的所有变量和函数
  • 活动对象 activation object:当进入一个执行环境时,被激活的变量对象即为活动对象
  • 全局执行环境:最外围的执行环境;例如浏览器中,全局执行环境为 window 对象
  • 执行环境的所有代码执行完毕后,该环境会被销毁,该环境的变量对象也会销毁
  • 每个函数都有自己的执行环境

作用域

  • 代码在一个执行环境中执行时,会创建执行环境变量对象的一个作用域链
  • 作用域链最后端是全局执行环境的变量对象
  • 作用域链最前端是当前执行环境的变量对象
  • 函数执行环境的作用域链最前端是 arguments 对象

ES6+ 开始有块级作用域,但需要注意浏览器中的兼容实现导致 var 变量不限于块级作用域,因此最好使用 let、const。

闭包

闭包函数是指能够访问另一个函数作用域变量的函数(闭包函数作用域链上)。最常见的是在函数内部定义函数。

  1. function closureCreator() {
  2. var index = 1;
  3. return function() {
  4. index++;
  5. }
  6. }
  7. var fn = closureCreator(); // fn -> 闭包
  8. fn(); // index: 2