关于执行环境与作用域链

执行环境

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

作用域链

当代码在一个环境中执行时,会创建变量对象(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)


    执行环境.jpg

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

  • 执行代码的思路:
    调用fn()———》执行fn1()———》renturn fn3()————》执行fn3——》执行fn2——》console.log(a)所在区域没有a,向父级作用域找a——》输出2;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作用域: 变量所在的上下文,指的是变量在哪些地方可以访问 对于JavaScript来说有全局作用域但是没有块级作用...
    戴西西的染坊阅读 251评论 0 2
  • 函数声明和函数表达式有什么区别 函数声明语法:function functionName(arg0,arg1,ar...
    _Dot912阅读 602评论 0 3
  • 1、立即执行函数表达式是什么?有什么作用 我们都知道,一般定义一个函数有函数声明和函数表达式两种方法:functi...
    zh_yang阅读 886评论 0 6
  • 上一篇文章我们提到,拿到当月工资,请先为自己开设3个账户。 1.日常开支账户2.应急备用账户3.理财投资账户 今天...
    笑忘书800阅读 1,180评论 5 6
  • 细想来,我似乎从未在这里写过很长的文章,想来一是没时间,二是懒,其实大多数的情况应该是懒吧! 今天适逢机缘巧合,本...
    慕容锦瑟阅读 524评论 2 2