关于执行环境与作用域链

执行环境

  • 全局执行环境是最外围的一个执行环境。
  • 每个函数都有自己的执行环境。

作用域链

当代码在一个环境中执行时,会创建变量对象(variable object)的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。

举例

var a = 1
function fn1(){
  function fn2(){
    console.log(a)// 这里可以访问到自己的变量对象、fn1()变量对象、全局变量对象
  }
  function fn3(){
    var a = 4
    fn2() // 这里可以访问到自己的变量对象、fn1()变量对象、全局变量对象
  }
  var a = 2
  return fn3 // 这里可以访问到自己的变量对象、全局变量对象,但这里不能访问fn2()、fn3()变量对象
}
var fn = fn1()
fn() //2
  • 以上代码有4个执行环境:
  1. 全局执行环境(包括变量a=1、函数fn1)
  2. fn1()的局部环境 (包括变量a=2、函数fn2、函数fn3)
  3. fn2()的局部环境
  4. fn3()的局部环境(变量a=4)


    关于执行环境与作用域链_第1张图片
    执行环境.jpg

上图表示是特定的执行环境。其中,内部环境可以通过作用域链去访问到所有外部环境,但外部环境不能访问内部环境的任何变量和函数。每个环境都可以向上搜索作用域链,以查询变量和函数,但不能向下搜索作用域链。例如fn2在所在区域搜索不到,只能向上搜索变量。即fn2()
的作用域链中包含3个对象:自己的变量对象、fn1()变量对象、全局变量对象

  • 执行代码的思路:
    调用fn()———》执行fn1()———》renturn fn3()————》执行fn3——》执行fn2——》console.log(a)所在区域没有a,向父级作用域找a——》输出2;

你可能感兴趣的:(关于执行环境与作用域链)