javascript的预编译和执行顺序

   最近在复习javascript的事件处理时发现了一个问题,而后也是我来写javascript的预编译和执行顺序的问题javascript

  代码:html

代码一
<html> <head> <title>事件处理</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <script type='text/javascript'> //页面在在完成加载后 window.onload=function(){ var input=document.getElementById('button'); var p=document.getElementById('p'); var i=1; while(input){ input.onclick=function(){ p.innerHTML+='<br />('+ i +') '+this.nodeName; } i++; input=input.parentNode; } } </script> </head> <body> <div> <input type='button' value='Event事件' id='button' /> <p id='p'>事件捕获的顺序:</p> </div> </body> </html>

 显示的结果为:java

                     

当我更改了代码中红色的部分后获得的结果又不相同:node

代码二
<html> <head> <title>事件处理</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <script type='text/javascript'> //页面在在完成加载后 window.onload=function(){ var input=document.getElementById('button'); var p=document.getElementById('p'); var i=1; while(input){ input.onclick=function(){ p.innerHTML+='<br />('+ i++ +') '+this.nodeName; } input=input.parentNode; } } </script> </head> <body> <div> <input type='button' value='Event事件' id='button' /> <p id='p'>事件捕获的顺序:</p> </div> </body> </html>

获得的结果为:函数

            

  得出这两种不一样的结果那是由于javascript代码在运行时有预编译和执行两个阶段,在预编译阶段会对函数和变量进行处理,对全部的声明变量会赋值为underfined,对全部的声明函数也会赋值为函数的定义。测试

  下面咱们来测试javascript的执行过程ui

  1.javascript代码执行顺序时按照脚本标签<script>出现的顺序来肯定的,浏览下面页面你会发现代码是按从上到下的顺序执行的this

<script type='text/javascript'>
    alert('one');
  </script>
  <script type='text/javascript'>
  alert('two');
  </script>
  <script type='text/javascript'>
  alert('three');
  </script>

   2. 由于变量在预编译时被赋予一个undefined初值,因此下面代码中,第一个变量name在代码中没有被赋值,全部就延用undefined这个值,下面的name被赋予了Jude,因此第二次输出的是Jude这个字符。spa

<script type='text/javascript'>
    alert(name);                    //显示undefined
    var name='Jude';
    alert(name);                    //显示Jude
</script>

  3.从以下结果中咱们知道先是连续两次输出Hello Wrold!,最后连续两次输出test,得出这样的结果是由于javascript并不是是彻底按照顺序执行的,而是在执行以前先进行一个预编译,预编译时声明式函数被提取出来,优先执行,并且相同的函数会进行覆盖,再执行赋值式函数。code

<script type='text/javascript'>
    test();                    //输出Hello World!
    function test(){       
        alert('hello');     //声明式函数 }
    test();                    //输出Hello World!

    var test=function(){    //赋值式函数
        alert('test');
    }
    test();                    //输出test
    function test(){      //声明式函数
        alert('Hello World!');
    }
    test();                    //输出test
</script>

  4.下面代码显示显示hello,再显示hello world!,这是由于javascript中的给个代码块是相互独立的,当脚本遇到第一个<script>标签时,则javascript解析器会等这个代码块加载完成后,先对它进行预编译,而后再执行之,而后javascript解析器准备解析下一个代码块,因为javascript是按块执行的,全部一个javascript调用下一个块的函数或者变量时,会出现错误

<script type='text/javascript'>
    function test(){
        alert('hello');                //显示hello
    }
    test()
</script>
<script type='text/javascript'>
    function test(){
        alert('hello world!');        //显示hello world!
    }
    test()
</script>

  5.虽然javascript是按块执行的,但不一样的块却属于相同的全局做用域,不一样的块的变量和函数式能够相互使用的,也就是某个块能够使用前面块的变量和函数,却不能够使用它以后的块的变量和函数

<script type='text/javascript'>
    alert(name);                    //显示undefined
    var name='Jude';
    function test(){
        alert('hello');
    }
    fun();                            //不能调用下一个块的函数
</script>
<script type='text/javascript'>
    alert(name);                    //能够调用上一个块的变量,显示Jude
    test();                            //能够调用上一个块的函数,显示hello
    function fun(){
        alert('fun');
    }
</script>

  6.javascript在预编译阶段是以函数来划分做用域的,而后再经过var 声明的变量来与声明函数开辟内存空间,对var变量赋初值undefined。在执行阶段再根据做用域来嘴变量进行赋值.

  第一个代码块中函数里面的变量a是局部变量,由于a在函数内从新用var定义,因此输出undefined,而变量b是全局变量,由于在函数内没有用var从新声明b,因此在给变量b赋值时到全局变量中找全局变量b的值,因此输出的是b.

  第二个代码块中的函数内都从新声明了变量a和b,因此他们都是函数内的局部变量,因此都输出undefined。

<script type='text/javascript'>
    var a='a';
    var b='b';
    function test(){
        alert(a);                //显示undefined
        alert(b);                //显示b
        var a='test';
    }
    test();
</script>
<script type='text/javascript'>
    var a='a';                    
    var b='b';                    
    function test(){
        alert(a);                //显示undefined
        alert(b);                //显示undefined
        var a='test';
        var b='test';
    }
    test();
</script>

  综上所述,javascript在执行时的步骤是:

    一、先读入第一段代码块

    二、对代码块进行语法分析,若是出现语法错误,直接执行第5步骤

    三、对var变量和function定义的函数进行“预编译处理”(赋值式函数是不会进行预编译处理的)

    四、执行代码块,有错则报错

    五、若是还有下一段代码块,则读入下一段代码块,重复步骤2

    六、结束

相关文章
相关标签/搜索