js(预解析)过程 (后)

本文详细介绍了JavaScript中的AO(活动对象)生成过程,通过三个示例展示了函数执行时AO如何随着代码执行逐步形成和更新。每个例子中,AO的属性值根据执行顺序被覆盖,揭示了JavaScript中变量提升和函数声明提升的概念。同时,文章强调了在分析过程中理解变量和函数声明的层叠覆盖的重要性。
摘要由CSDN通过智能技术生成

AO生成过程四部曲:

        1.先局部(在函数作用域内)创建AO对象.

        2.将函数的形参 、变量声明中的形参名和变量名作为AO的属性名,值为undefined.

        3.将实参值赋予形参.

        4.在函数体里找函数声明,将函数名作为AO的属性名,值为函数体.

在执行过程中AO的属性值会按函数内部执行顺序从上而下的进行覆盖,也就是同名不同值的会按先后顺序被覆盖

例一:

<script>
    function fn() {
        console.log(a);
        var a = 1;
        console.log(a);
     }
     fn();
</script>

求上面fn函数的打印结果;我们根据四部曲来逐步分析。

AO {                                              

a:undefined                                

}                                                     

function fn() {                        
        console.log(a); ==>  此时AO里的a的属性值为undefined ,打印a的值即为undefined                 
        a = 1;               ==>  此时AO里的a的属性值被重新赋值变为1                             

        console.log(a); ==>  此时再次打印a的值是1                                       
     }                                                                                                     
     fn();

来看下运行结果:

例二:

function test(a, b) {
     document.write(a);/*1*/
     c = 0;/**/
     var c;
     a = 3; b = 2;
     document.write(b);/*2*/
     function b() { }
     function d() { }
     document.write(b);/*2*/
}
test(1);

AO {

        a: 1,

        c :undefined,

        b:function b(){ },

        d:function d(){ },

}

function test(a, b) {
     document.write(a);==> AO里的a为1,输出a为1        /*1*/
     c = 0;          ==> 此时AO里的c被重新赋值变为0        
     var c;        ==> 变量c已被提升,不用分析
     a = 3; b = 2;       ==> 此时AO里的a和b被重新赋值变为3和2
     document.write(b);   ==> 此时打印b为2                        /*2*/
     function b() { }        ==>函数b已提升不用分析
     function d() { }        ==>函数d已提升不用分析
     document.write(b);        此时打印b为2                           /*2*/
}

来看下打印结果:

例三

function test(a, b) {
   console.log(a); /* function a() { }*/
   console.log(b); /*ud*/
   var b = 234;
   console.log(b); /*234*/
   a = 123;
   console.log(a);/*123*/
   function a() { }
   var a;
   b = 234;
   var b = function () { }
   console.log(a);/*123*/
   console.log(b); /*function () { }*/
 }
 test(1);

AO {

        a:function a() { },

        b:undefined

}

function test(a, b) {
   console.log(a);   ==>  初始时AO里的a为function a() { },打印即为函数体function a() { }    console.log(b);   ==> 同理b为undefined,打印即为undefined
   var b = 234;        ==> 此时相当于b被提升,b被重新赋值变为234
   console.log(b);    ==>此时打印b即为234
   
a = 123;               ==>a 被重新赋值变为123
   console.log(a);    ==> 此时打印a即为123
   function a() { }        ==>函数a已提升不用分析
   var a;                     ==>变量a已提升不用分析
   b = 234;                ==>b重新赋值变为234
   var b = function () { }        ==> b被重新赋值变为function () {}
   console.log(a);       ==> 打印a即为123
   console.log(b);          ==> 打印a即为function () {}
 }
 test(1);

打印结果:

 小结:我们可以看出js引擎在生成AO后开始一行行读取函数内部代码,过程中若出现函数声明的名称和变量名名称相同的情况时,对应的值会根据先后顺序进行层叠覆。所以在分析过程中我们要一层层的对变量函数进行分析。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值