执行环境:
定义了变量、函数有权访问其他数据,决定了他们各自的行为
每当一个执行流进入函数时,就会被推入环境栈中,执行完之后,就被弹出,最底层就全局环境window
变量对象:
每个环境都有一个与之关联的变量对象,这个个对象里面就定义所有的函数和变量
换句话说,在变量提升时,是将提升到了一个对象上-----变量对象,通过这个对象去访问。这也是 js 没有块级作用域的原因
在执行函数前,会创建山下文对象,接着就是创建变量对象,对于函数
1、建立arguments对象
2、找到这个将要执行的函数内的所有函数声明,键值对形式,保存值
3、变量声明,复制
作用域链:
当代码在执行时就会创建作用域链,作用是保证对执行环境变量的有权访问和函数有序访问
作用域链的前端就是当前的变量对象,对于函数则是 活动对象(arguments对象),下一个变量对象就来自于下一个包含环境