溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript是由什么解析的

發布時間:2021-06-22 16:05:50 來源:億速云 閱讀:131 作者:chen 欄目:web開發

本篇內容介紹了“javascript是由什么解析的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

javascript是一種解釋型的腳本語言,可以由瀏覽器動態解析和執行。javascript本身就是游覽器可以直接識別的,javascript的解釋器被稱為javascript引擎,是瀏覽器默認的一部分。

本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

  javascript是一種解釋型的腳本語言,它不同于java或者c#這種編譯語言,不需要編譯成瀏覽器可識別的語言,而是由瀏覽器動態解析和執行的。(本身就是瀏覽器可以直接識別,javascript的解釋器被稱為javascript引擎,是瀏覽器默認的一部分)

下面給大家介紹一下javascript的解析過程。要理解javascript的解析過程,先了解幾個概念。

1.代碼塊

  javascript中的代碼塊是指由<script>標簽分割的代碼段。

<script type="text/javascript">
      console.log("這是代碼塊一");
  </script>

  <script type="text/javascript">
      console.log("這是代碼塊二");
  </script>

  JS是按照代碼塊來進行編譯和執行的,代碼塊間相互獨立,但變量和方法共享。

<script type="text/javascript">
      console.log(str);        //因為沒有定義str,所以瀏覽器會出錯,下面的不能運行
      console.log("我是代碼塊一");   //沒有運行到這里
      var test = "我是代碼塊一變量";
</script>

<script type="text/javascript">
      console.log("我是代碼塊二");    //這里有運行到
      console.log(test);         //輸出undefined,因為第一個代碼塊執行第一行代碼的時候游覽器報錯,代碼塊中第一行下面的所有代碼都沒有執行。故test的定義了,但沒有賦值。(為什么test定義了卻沒有賦值,因為變量申明的提升)
</script>

  上面的代碼中代碼塊一中運行報錯,但不影響代碼塊二的執行,這就是代碼塊間的獨立性,而代碼塊二中能調用到代碼一中的變量,則是塊間共享性

2.聲明式函數與賦值式函數

<script type="text/javascript">
     function Fn(){ //聲明式函數
     console.log('我是聲明式函數');
     }
     var Fn = function{  //賦值式函數
       console.log('我是賦值式函數');
     }
</script>

  聲明式函數與賦值式函數的區別在于:在JS的預編譯期,聲明式函數將會先被提取出來,然后才按順序執行js代碼。

預編譯期與執行期:

  事實上,JS的解析過程分為兩個階段:預編譯期(預處理)與執行期。

  預編譯期JS會對本代碼塊中的所有聲明的變量和函數進行處理,但需要注意的是此時處理函數的只是聲明式函數,而且變量也只是進行了聲明但未進行初始化以及賦值。

<script type="text/javascript">
     Fn();                 //執行結果:"執行了函數2",同名函數后者會覆蓋前者
     function Fn(){       //函數1
        console.log("執行了函數1");
     }
     function Fn(){      //函數2
        console.log("執行了函數2");
     }
</script>
<script type="text/javascript">
      Fn(); //執行結果:"執行了聲明式函數",在預編譯期聲明函數及被處理了,所以即使Fn()調用函數放在聲明函數前也能執行。
      function Fn(){ //聲明式函數
      console.log("執行了聲明式函數");
      }
      var Fn = function(){  //賦值式函數      console.log("執行了賦值式函數");     } </script>
//代碼塊一
<script type="text/javascript">
      console.log(str);//瀏覽器報錯,但并沒有輸出信息
</script>

//代碼塊二
<script type="text/javascript">
      console.log(str);//控制臺輸出"undefined"
      var str = "aaa";
</script>

//js在預處理期對變量進行了聲明處理,但是并沒有進行初始化與賦值,所以導致代碼塊二中的變量是unfiened的,而代碼一中的變量是完全不存在的,所以瀏覽器報錯。

我們來看看下面這個例子

<script type="text/javascript">
      Fn(); //瀏覽器報錯:"undefined"
</script>

<script type="text/javascript">
      function Fn(){ //函數1
          console.log("執行了函數1");
      }
</script>

????

因為javascript的引擎是按照代碼塊來進行預處理和執行的,也就是說預處理的只是執行到的代碼塊的聲明函數和變量,而對于還未加載的代碼塊,是沒法進行預處理的,這也是邊編譯邊處理的核心所在。

總結:

  step 1. 讀入第一個代碼塊。

  step 2. 做語法分析,有錯則報語法錯誤(比如括號不匹配等)并跳轉到step5,沒錯跳轉step3。

  step 3. 對var變量和function定義做“預編譯處理”(永遠不會報錯的,因為只解析正確的聲明)。

  step 4. 執行代碼段,有錯則報錯(比如變量未定義)。

  step 5. 如果還有下一個代碼段,則讀入下一個代碼段,重復step2。

  step 6. 結束。

“javascript是由什么解析的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女