知识卡片
作用域链是变量解析的查找链
内容
每一段JavaScript代码(全局代码或函数体)都关联着一条作用域链——一串对象组成的列表,每个对象都保存着一批变量。查找一个变量时,引擎从链的第一个对象开始逐个查找,找到就返回,找不到就沿链往上找,直到全局对象;如果全局对象也没有,才抛出引用错误。全局代码的作用域链只有一个全局对象;不嵌套的函数体内是”局部变量对象+全局对象”两层;嵌套函数则更长。关键的微妙之处在于:函数定义时就已经捕获了当时的作用域链,每次调用外部函数都会新建一份局部变量对象接到这条链上,所以同一段内部函数代码在外部函数的每次调用中,实际关联的作用域链都是不同的实例。这正是理解[[闭包如何通过作用域链访问外部变量]]的地基——闭包不是魔法,只是函数携带着自己被定义时的作用域链一起被传递出去。
参考来源
《JavaScript权威指南(原书第6版)》第3章《类型、值和变量》