【转载---js基础】浏览器中“JavaScript解析器”工做原理

 

浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工做。javascript

JavaScript解析器工做步骤:html

一、“找一些东西”: var、 function、 参数;(也被称之为预解析)java

备注:若是遇到重名分为如下两种状况:浏览器

遇到变量和函数重名了,只留下函数函数

遇到函数重名了,根据代码的上下文顺序,留下最后一个post

二、逐行解读代码。spa

备注:表达式能够修改预解析的值code

 

JS解析器在执行第一步预解析的时候,会从代码的开始搜索直到结尾,只去查找var、function和参数等内容。通常把第一步称之为“JavaScript的预解析”。并且,当找到这些内容时,全部的变量,在正式运行代码以前,都提早赋了一个值:未定义;全部的函数,在正式运行代码以前,都是整个函数块。htm

 

实例分析:blog

实例一:

复制代码
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <script type="text/javascript">
 7         alert(a);
 8     </script>
 9 </head>
10 <body>
11 
12 </body>
13 </html>
复制代码

这段代码运行后,浏览器会报错。

缘由:因为,“JavaScript解析器”在解析JS代码时,未找到var、function、参数等其中的任何一个,因此,当逐行执行代码时,由于在“仓库”中找不到a,不认识a,就会报错。

 

实例二:

复制代码
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <script type="text/javascript">
 7         alert(a);
 8         var a = 1;
 9     </script>
10 </head>
11 <body>
12 
13 </body>
14 </html>
复制代码

这段代码运行后,浏览器会弹出”undefined”。

缘由:因为,“JavaScript解析器”在解析JS代码时,找到var关键字,而后得知有一个变量a,因此会给a默认赋值一个undefined值,存入“仓库”中,因此,当逐行执行代码时,找到变量a,由于此时的a的值为undefined,因此弹出的值为undefined。

 

实例三:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        var a = 1;
        alert(a);
    </script>
</head>
<body>

</body>
</html>
复制代码

这段代码运行后,浏览器会弹出数字“1”。

缘由:因为,“JavaScript解析器”在解析JS代码时,找到var关键字,而后得知有一个变量a,因此会给a默认赋值一个undefined值,存入“仓库”中,在逐行执行代码时,先找到变量a,此时的a的值为undefined,当执行到var a= 1 这行代码时,a获得了一个新的赋值“1”因此弹出的值为数字“1”。

 

实例四:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        alert(a);
        var a = 1;
        alert(a);
        function a () {
            alert(2);
        }
        alert(a);
        var a = 3;
        alert(a);
        function a () {
            alert(4);
        }
        alert(a);
    </script>
</head>
<body>

</body>
</html>
复制代码

这段代码运行后,弹出值的顺序依次为:function a () {alert(4);}、一、一、三、3

缘由:因为,“JavaScript解析器”在逐行解析代码时,先找到var关键字,而后得知有一个变量a,因此会给a默认赋值一个undefined值,存入“仓库”中,而后,继续向下解析代码,当找到function a () {alert(2);}时,根据“函数和变量重名,保留函数”的规则,此时的a变为function () {alert(2);},再继续向下找,当找到变量a的时候,不变,仍继续向下找,当找到函数function () {alert(4);}时,根据“函数重名上下文”原则,替换为function () {alert(4);},最终a被赋值为function () {alert(4);},存到“仓库”中,当逐行执行代码时,执行到第一个alert(a)时,将会弹出“function () {alert(4);}”,接着向下执行,当执行到a=1时,因为表达式能够改变预解析的值,因此此时的a变为1,执行到第二个alert(a)时,弹出值为1,当执行到function a () {alert(2);}时,因为此时是一个函数声明,并不会修改a的值,因此执行到第三个alert(a)时,弹出的仍为数字“1”,依次类推,此后将会陆续弹出“3”、“3”。

相关文章
相关标签/搜索