分析一个JavaScript预解析的题

本文详细剖析了一段JavaScript代码的执行过程,包括预解析阶段如何处理变量声明和函数定义,以及执行阶段如何依据预解析结果进行变量赋值和函数调用。通过具体示例解释了变量提升和函数提升的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇转了预解析的总结,学习了,感谢!
下面找了个综合的题目来一步步剖析…

        alert(a);
        var a = 1;
        alert(a);
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();
浏览器解析js的步骤
  1. 先是预解析(找关键词 var, function, 参数),获取的数据记录
  2. 然后一句句代码执行

开始

        alert(a);                     // 它什么都没有
        var a = 1;                    // 它有 var  记下来
        alert(a);
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();
记录结果

a = undefined;

(var 的值都不读,凡是var声明的变量预解析就给undefined)

继续下一句

        alert(a);                     // 它什么都没有
        var a = 1;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){ alert(2);}      // 它有 function 记下来
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);
        alert( typeof a);
        a();
记录结果

a = undefined;
a = function a(){ alert(2) }; // 看到function 关键字就全记下来
但是,这俩不会都记下来的,都记下来,后边来人要用 a ,他俩谁上??
这样规定的,function 和 undefined 都在,取 function

所以,现在的记录结果是:
a = function a(){ alert(2) };

继续下一句

        alert(a);                     // 它什么都没有
        var a = 1;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){ alert(2);}      // 它有 function 记下来
        alert(a);                     // 它什么都没有
        var a = 3;                   // 它有 var  记下来
        alert(a);                    
        function a(){alert(4);}
        alert(a);
        alert( typeof a);
        a();
记录结果

a = function a(){ alert(2) };
a = undefined;
都是 a 比较一下吧;
留 a = function a(){ alert(2) };

继续下一句

        alert(a);                     // 它什么都没有
        var a = 1;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){ alert(2);}      // 它有 function 记下来
        alert(a);                     // 它什么都没有
        var a = 3;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){alert(4);}       // 它有 function 记下来
        alert(a);
        alert( typeof a);
        a();
记录结果

a = function a(){ alert(2) };
a = function a(){ alert(4) };
都是 a, 又都是function,那就后面的覆盖之前的
留下 a = function a(){ alert(4) };

继续下一句

        alert(a);                     // 它什么都没有
        var a = 1;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){ alert(2);}      // 它有 function 记下来
        alert(a);                     // 它什么都没有
        var a = 3;                    // 它有 var  记下来
        alert(a);                     // 它什么都没有
        function a(){alert(4);}       // 它有 function 记下来
        alert(a);                     // 它什么都没有
        alert( typeof a);             // 它什么都没有
        a();                          // 它什么都没有  结束
记录结果

a = function a(){ alert(4) };

开始执行代码

        alert(a);
        var a = 1;
        alert(a);
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

执行代码过程中赋值语句会修改 预解析的记录结果

        alert(a);                    //执行这一行  输出 a      
        var a = 1;
        alert(a);
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

根据记录结果 输出 function a(){ alert(4) };

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

记录由 a = function a(){ alert(4) }; 改为 a = 1;

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}
        alert(a);
        var a = 3;
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

输出结果 1

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}     //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a
        var a = 3;                   
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

输出结果 1

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}     //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a
        var a = 3;                   //执行这一行 赋值语句 改变记录
        alert(a);
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

记录 a = 3;

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}     //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a
        var a = 3;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a   
        function a(){alert(4);}
        alert(a);

        alert( typeof a);
        a();

输出结果 3

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}     //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a
        var a = 3;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a   
        function a(){alert(4);}      //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a 

        alert( typeof a);            
        a();

结果 3

        alert(a);                    //执行这一行  输出 a      
        var a = 1;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a
        function a(){ alert(2);}     //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a
        var a = 3;                   //执行这一行 赋值语句 改变记录
        alert(a);                    //执行这一行  输出 a   
        function a(){alert(4);}      //执行这一行 没有赋值,也没调用
        alert(a);                    //执行这一行  输出 a 

        alert( typeof a);            // a是3 Number
        a();                         // 3(); 报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值