• 浏览器解析js的顺序


    javascript解析器工作步骤

    1. “找到一些东西”:var、function、参数;(预解析)

      备注:如果遇到重名分为以下两种情况

      • 变量和函数重名时,只留下函数
      • 函数重名,根据代码的上下文顺序,留下最后一个
    2. 逐行解读代码

      备注:表达式可以修改与预解析的值

      • 函数调用:也会进行预解析:找到var、function、参数
      • JS解析器在执行第一步预解析的时候,会从代码的开始搜索直到结尾,只去查找var、function和参数等内容。一般把第一步称之为“JavaScript的预解析”。而且,当找到这些内容时,所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;所有的函数,在正式运行代码之前,都是整个函数块。
    实例1
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>Document</title>
     <script type="text/javascript">
     alert(a);      //function a () {alert(4);}
     var a = 1;
     alert(a);      //1
     function a () {
     alert(2);
     }
     alert(a);      //1
     var a = 3;
     alert(a);      //3
     function a () {
     alert(4);
     }
     alert(a);      //3
     </script>
    </head>
    <body>
    </body>
    </html>
    

    原因:由于,“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”。
    实例2
    var a=1;
    function fn(){
    	alert(a);	//1
    	a=2;
    }
    fn();
    alert(a);		//2
    
    原因:在fn函数里面没有var,就根据作用域链往父级外面找
    实例3
    var a=1;
    function fn(a){
    	alert(a);		//1
    	a=2;
    }
    fn(a);
    alert(a);		//1
    
    原因:在fn函数中,只是将全局变量a的值赋给了fn的参数,全局变量a完全没有影响,相当于值传递
    实例4
    var a=1;
    function fn(a){
    	alert(a);		
    	a=2;
    }
    fn();			//undefined
    alert(a);		//2	
    
    原因:调用fn是没有将全局变量的a传给fn的参数,所以打印出来会是undefined;而后面的是打印的全局变量的a
  • 相关阅读:
    SPF(poj 1523) 割点入门
    从一个例子讲解拷贝构造函数与return
    还是引用
    引用的实质
    const
    三目运算符
    关于C语言链表的学习
    CS2013调试DLL
    fread与fwrite的自我理解
    可见字符与不可见字符
  • 原文地址:https://www.cnblogs.com/15fj/p/8413913.html
Copyright © 2020-2023  润新知