关于执行环境与作用域链

2018-04-14  本文已影响0人  usopp酱

执行环境

作用域链

当代码在一个环境中执行时,会创建变量对象(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
  1. 全局执行环境(包括变量a=1、函数fn1)
  2. fn1()的局部环境 (包括变量a=2、函数fn2、函数fn3)
  3. fn2()的局部环境
  4. fn3()的局部环境(变量a=4)


    执行环境.jpg

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

上一篇 下一篇

猜你喜欢

热点阅读