函数的作用域链的理解
1. 作用域 (scope):在javascript 没有块级作用域 ,是由函数来划分的。 变量和函数的作用域是在定义时决定而不是执行时决定 ,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域(with和eval除外)。当定义了一个函数,当前的作用域链就保存起来,并且成为函数的内部状态的一部份。在最顶级作用域链仅由全局对象组成,而不和词法作用域相关,然而,当定义一个嵌套的函数时,作用域链就包括外面的包含函数。这意味着嵌套函数可以访问包含函数的所有参数和局部变量。尽管当一个函数定义时作用域链就固定了,但作用域链中定义的属性还没有固定。作用域链是活的,并且函数被调用时,可以访问任何当前的绑定。 2. 作用域链 (scope chain):存储 变量对象 的集合( 环境栈 ?),保证对执行环境有权访问的所有变量和函数的有序访问,也就是用于标识符解析(变量访问)。 3. 执行环境 (execution context):定义了变量和函数有权访问的其他数据,决定了它们的各自行为。每个执行环境都有一个与之关联的变量对象。 在web浏览器中,window对象就是全局执行环境。每个函数都有自己的执行环境,当函数执行完毕,该环境被销毁,保存在其中的变量和函数也随之销毁。 4. 变量对象 (variable object):保存了环境中定义的所有变量和函数