javascript運行過程當中的「預編譯階段」和「執行階段」

javascript相對於其它語言來講是一種弱類型的語言,在其它如java語言中,程序的執行須要有編譯的階段javascript

而在javascript中也有相似的「預編譯階段」(javascript的預編譯是以代碼塊爲範圍<script></script>,即每遇到一個代碼塊都會進行  預編譯>執行),java

瞭解javascript引擎的執行機理,將有助於在寫js代碼過程當中的思路總結web

首先科普下javascript中的兩種聲明方式,var和function,前者聲明的是變量,後者聲明的是方法函數

在預編譯中,javascript對這兩種聲明作出了兩種處理方案spa

<script>

  var a = "1";    //聲明變量a

   function b(){    //聲明方法b
        alert();
  }
  var c = function(){    //聲明變量c
    alert();
  }

</script>

 

以上代碼塊中,a、c爲變量賦值,b爲函數聲明,當執行以上的代碼時,code

首先會進入預編譯階段,blog

對與變量賦值a、c會在內存中開闢一塊內存空間並指向變量名,且賦值爲undefinedip

對於函數聲明,則一樣會進行開闢內存空間,但此時會直接將函數體進行處理,即用函數聲明方式,則在預編譯階段便已完成了函數的建立工做內存

預編譯階段:(PS:無論代碼中聲明變量和聲明函數的順序如何,在預編譯階段會先聲明變量,再聲明函數作用域

<script>
    var a = undefined;
    var c = undefined;
    
    var b = function(){
      alert();
    }
</script>

 

執行階段:

<script>
    a = "1";
    c = function(){
      alert();
    }
</script>

 

總體執行步驟:

<script>
    var a = undefined;
    var c = undefined;
    
    var b = function(){
      alert();
    }
    a = "1";
    c = function(){
      alert();
    }
</script>

題目:

<script>

    var a = "1";

    function b(){

      alert(a);

      var a = "2";

    }

    b();

</script>

PS:相對與window環境下的變量、函數聲明,每個做用域都會對其下的變量和函數進行先聲明

<script>      
  functionHello() {        
    alert("Hello");       
  }        
  Hello();  
</script>   
<script>   
  functionHello() {          
    alert("Hello World");     
  }       
  Hello();  
</script>
<script>   
  function Hello() {        
    alert("Hello");   }   Hello(); 
  function Hello() {          
    alert("Hello World");   }   Hello(); </script>

 

博客:http://www.cnblogs.com/alex-web/

注:小瘋紙的yy

相關文章
相關標籤/搜索