日期:2014-05-16  浏览次数:20394 次

理解闭包_javascript执行环境

执行环境

执行环境可以理解为一个栈,而全局变量——一切Js在其中发生,可以理解为栈底或者是一个装载其他子执行环境的容器。

函数执行是会在其自己的执行环境中执行,递归调用中,每一次递归调用都会有新的执行环境。当调用完成后,函数会返回原始的执行环境。

?

调用函数式,函数的执行环境的创建过程:

?

1. 在函数的执行环境中,创造一个活动对象(没有预定义原型的对象,且不可直接引用)

2. 创建一个arguments对象,这个对象类似数组,拥有length,callee等属性。arguments以整数下标的形式保存实际传入函数的参数。length对应实际传入参数的个数。

3. 为活动对象创建arguments属性,指向创建好的arguments对象

4. 为执行环境分配作用域,每个函数内部的[[scope]]属性由对象列表(链)组成,这个[[scope]]会被指定给一个函数调用执行环境,作为其作用域,同时把活动对象被添加到执行环境[[scope]]的前端

5. “可变对象”(这时的可变对象就是活动对象)完成“对象实例化”创建可变命名参数,依照函数定义的形式参数。接收实际参数,没有获得实际参数的可变命名参数被置为undefined

6. 对于内部声明的函数,在执行环境中创建新的函数对象,然后创建函数名属性(指针)指向新创建的内部函数对象。并将在函数内部声明的所有局部变量创建为可变对象的命名属性。根据声明的局部变量创建的可变对象的属性在变量实例化过程中会被赋予 undefined 值。在执行函数体内的代码、并计算相应的赋值表达式之前不会对局部变量执行真正的实例化。事实上,拥有 arguments 属性的活动对象和拥有与函数局部变量对应的命名属性的可变对象是同一个对象。因此,可以将标识符 arguments 作为函数的局部变量来看待。

7. 为this关键字赋值

?

??如果this指向一个对象的引用(比如对象的方法),则this就是引用该对象的属性。

  1. var?ref?=?{??
  2. ????????????boy?:?"CaoLixiang",??