javascript運行過程中的“預編譯階段”和“執行階段”


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

而在javascript中也有類似的“預編譯階段”(javascript的預編譯是以代碼塊為范圍<script></script>,即每遇到一個代碼塊都會進行  預編譯>執行),

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

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

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

<script>

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

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

</script>

 

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

首先會進入預編譯階段,

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

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

預編譯階段:(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM