js 解析过程

来源:互联网 发布:雅兰 深睡尊享版 知乎 编辑:程序博客网 时间:2024/06/07 05:40

浏览器在读取HTML文件的时候,当遇到script标签的时候,才会正式开始工作。
JavaScript解析器工作步骤:
1、预解析(声明期): var、 function、 参数;
会从代码的开始搜索直到结尾,只去查找var、function和参数等内容并提升他们
提升:函数声明、变量声明、被提升到范围作用域的顶端 :

var a=10;  中var就是变量声明,被提升,并预解析成了a="undefined"function fn(){alert(110)};中fn函数声明,被提升,并解析成了fn=function fn(){alert(110)}就等于它本生;

备注:如果遇到重名分为以下两种情况:
1.遇到变量和函数重名了,只留下函数
例子:

 var a=10; function a(){alert(110)}; 最终在预解析里只有  a= function a(){alert(110)};

2.遇到函数重名了,根据代码的上下文顺序,留下最后一个(后来居上)

 function a(){alert(110)} function a(){alert(120)} 最终在预解析里只有  a= function a(){alert(120)}

2、逐行解读代码。


例子:

<script type="text/javascript">        alert(a);        var a=10;        function fn(){alert(a); }        fn();</script>
      1预解析           a="undefined"           fn= function fn(){alert(a);}      2逐行解读代码(从script第一行开始)           alert(a);    a="undefined"(预解析里) //undefined           var a=10;  此时预解析里的a"undefined"变成10           fn();//10

重名情况1(函数声明和变量声明):

<script type="text/javascript">         alert(a);          var a=10;          function a(){            alert(a);          }          a();</script>
      1预解析         a= function a(){alert(a);}      2逐行解读代码(从script第一行开始)           alert(a);  // function a(){alert(a);}           var a=10;  此时预解析里的a从function a(){alert(a);}变成10           a();就相当于10();// a is not a function

重名情况2(函数声明和函数声明):

 <script type="text/javascript">        function a(){            alert(110);          }          function a(){            alert(120);          }          a();</script>
      1预解析         a= function a(){alert(120);}      2逐行解读代码(从script第一行开始)         a();就相当于function a(){alert(120);}() ;//120

原创粉丝点击