最佳答案
简单来说就是一个对象列表。那么这个对象列表是怎么来的呢?每次调用js函数时,编译器环境都会为这个js函数创建一个新的对象(上下文对象)来保存局部变量,并且把这个新的对象添加到作用域链中。当函数返回时,就从作用域链中将绑定变量的对象移除。
js权威指南中的一段话很好的诠释这个概念,摘录如下:
在js的顶层代码中(即不包含在任何函数定义内的代码),作用域链由一个全局对象组成。在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象(上下文对象),第二个是全局对象。在一个嵌套函数体内,作用域链上至少有三个对象。
对象作用域链创建规则,当定义一个函数时,它实际上保存一个作用域链。当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的"链"。
对于嵌套函数,每次调用外部函数时,内部函数会重新定义一遍。因此每次调用外部函数时,作用域链都不同。每次调用外部函数时,虽然内部嵌套函数的代码没变,但是关联这段代码的作用域链不相同了,所以内部函数也有差别,做永远链不同了。