javascript函数执行环境创建过程及解析

来源:互联网 发布:4000三个月淘宝代运营 编辑:程序博客网 时间:2024/06/05 16:02

简单的代码:

    function say(msg,other){        var str = "nobody say:";        this.name = '笨蛋的座右铭';        function innerMethod(){        alert(str);        };        alert(str+msg);    }    say('hello world');    alert(name);//笨蛋的座右铭


**

第一步:当调用say方法时,创建其执行环境(执行环境创建的时机为函数被调用时),按照定义的先后顺序完成一系列操作:

**

1.首先创建一个’活动对象’(Activation Object),也可以叫做变量对象。

解释:之所以称之为对象,是因为它拥有可访问的命名属性,但是它又不像正常对象那样具有原型(至少没有预定义的原型),而且不能通过 JavaScript 代码直接引用活动对象。

2.下一步是为函数调用创建一个类似数组的arguments对象。

解释:arguments对象保存着调用函数时所传递的参数。然后将arguments对象保存到活动对象中,以“arguments”作为key属性名,arguments对象作为属性值。arguments保存的是实参值,length长度与实参个数对应,但是可以通过函数定义的形参访问arguments里面的实参值,如果形参数量多于实参数量,多余的形参声明值为undefined。

3.接着,为执行环境分配作用域链。作用域链由变量对象列表(链)组成。

解释:每一个函数内部都会创建一个[[scope]]属性,对应的是一个存放变量对象(活动对象)的列表,称为作用域链,创建函数执行环境时,将定义函数所在的执行环境对应的作用域链复制到当前函数的[[scope]]属性,并把自己的活动对象(变量对象)推入到[[scope chain]]的顶部。

4.之后发生由ECMA-262中所谓’活动对象’完成的’变量实例化’(Variable Instatiation)的过程。

解释:(1)、此时将函数的形参创建为活动对象(变量对象)的属性,如果调用函数时传递的参数与形式参数一致,则将相应参数值赋给这些属性,否则,会给属性赋 undefined 值。(2)、将函数内部声明的所有局部变量创建为活动对象(变量对象)的属性,其值都被'预解析'为undefined值,以上两步完成活动对象(变量对象)保存变量的过程。(3)、对于定义的内部函数,用声明的函数名innerMethod,为活动对象(变量对象)创建同名属性,而定义的内部函数则被创建为函数对象并指定给该属性,完成活动对象(变量对象)保存函数的过程。注:在这个过程中,除了实际参数和函数声明有值外,其它都被'预解析'为undefined值。注:对于(1)、(2)、(3)步骤的顺序,因为变量声明比函数声明的优先级高,变量声明优先于函数声明被提升,如果两者同名同时存在,后被提升的函数声明会覆盖先被提升的变量声明**(引用来源作者(2)、(3)顺序反了)**。注:对于(2),函数被赋值为函数定义的字符串,并不会对函数体中的JS代码做特殊处理(如运算等),只是将函数体JS代码的扫描结果(字符串)保存在活动对象(变量对象)的与此函数名对应的属性上,在函数执行时再做进一步处理。

5.最后,要为使用this关键字赋值,此时的this指向的是全局对象,即window。



**

第二步:执行环境创建成功后,在函数体内,从上到下执行代码。

**

1.当执行到var str=’nobody say’会发生称之为’计算赋值表达式’的过程,将活动对象(变量对象)中key属性名为str的属性值从undefined设置为’nobody say:’。

2.执行到this.name=’笨蛋的座右铭’时,会为作为this的对象添加属性name,并赋值为’笨蛋的座右铭’。

3.然后是执行’alert(str+msg),输出’nobody say:hello world’。

注:引用来源作者认为此步执行了function innerMethod(){。。。},实际是在say()函数创建执行环境时,已经完成了对innerMethod的声明(看上面(2)步),因为执行过程中并未对innerMethod函数调用,innerMethod函数也未创建执行环境(调用时创建),所以执行过程直接跳过此函数。

4.最后执行alert(name),输出’笨蛋的座右铭’。



引用来源:http://www.cnblogs.com/fool/archive/2010/10/19/1855266.html

0 0
原创粉丝点击