首頁 >web前端 >js教程 >淺談JavaScript 的執行順序_javascript技巧

淺談JavaScript 的執行順序_javascript技巧

WBOY
WBOY原創
2016-05-16 15:46:291143瀏覽

雖然現代瀏覽器可以並行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關係,他們的執行依然是按照引入順序進行的。

這篇文章記錄本人在學習 JavaScript 中看書理解到的一些東西,加深記憶和並且整理記錄下來,方便之後的複習。

在 html 文件中的執行順序

js程式碼執行順序比較的形象,使用者可以直覺的感受這種執行順序。但是,js程式碼的執行順序是比較複雜的。有時候我們會把js程式碼寫在html裡面,html文檔在瀏覽器中解析的過程是這樣:瀏覽器依照文件流從上到下逐步解析頁面結構和資訊。 js程式碼作為嵌入的腳本也算做html文檔的組成部分,因此,js程式碼在裝載時的執行順序也是根據腳本標籤<script>的出現來順序來決定。 (下面一個栗子)</script>

<!DOCTYPE html>
<script>
  console.log("顶部脚本");
</script>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script>
    console.log("头部脚本");
  </script>
</head>
<body>
  <script>
    console.log("页面脚本");
  </script>
</body>
</html>
<script>
  console.log("底部脚本");
</script>

還有對於透過腳本標籤<script>的src屬性導入的外部js文件腳本,它也將按照其語句出現的順序來執行,而且執行過程是文檔裝載的一部分,不會因為是外部js文件而延期執行。 </script>

// 先加载 b.js 并且执行里面的代码
<script src="b.js"></script>
// 然后在按顺序执行下面的代码
<script>
  console.log(1);
</script>

預編譯

當js引擎解析的時候,它會在預先編譯對所有宣告的變數和函數進行處理。

變數提升

console.log(a); // undefined
var a = 1;
console.log(a); // 1

預解析函數

f(); // 1
function f() {
  console.log(1);
};

詳細:javascript變數宣告提升(hoisting)

分塊執行程式碼

js是按區塊執行程式碼的,所謂程式碼區塊就是使用<script>標籤分隔的程式碼片段。 (下面一個栗子)</script>

<script>
  // 代码段1
  var a = 1;
</script>
<script>
  // 代码段2
  function f() {
    console.log(1);
  };
</script>

因為js是按程式碼區塊來執行的。瀏覽器在解析html文檔流的時候,如果遇到一個<script>標籤,js會等到這個程式碼區塊都載入完之後再對程式碼進行預編譯,然後在執行。執行完畢後,瀏覽器會繼續解析西門的html文檔流,同時js也準備好處理下一個程式碼區塊。 </script>

有個小坑,由於js是按區塊執行的,因此在一個js區塊中呼叫後面區塊宣告的變數或函數就會提示語法錯誤。但是不同區塊都屬於一個全域作用域,也就是說,區塊之間的變數和函數是可以共享的。 (下面一個栗子)

<script>
  // 代码段1
  console.log(a);
  f();
</script>
<script>
  // 代码段2
  var a = 1;
  function f() {
    console.log(1);
  };
</script>

由於js是按區塊處理程式碼,同時又遵循html文檔流的解析順序,因此在上面的栗子中會看到語法錯誤。但是,在文檔流加載完畢後再次訪問就不會出現這種錯誤了。 (下面一個栗子)

<script>
  window.onload = function(){ // 页面初始化事件处理函数
    // 代码段1
    console.log(a);
    f();
  }
</script>
<script>
  // 代码段2
  var a = 1;
  function f() {
    console.log(1);
  };
</script>

還有為了安全起見,一般在頁面初始化完畢之後才允許js程式碼執行,這樣就可以避免一些網路速度對js執行的影響。同時,也避開了html文檔流對js執行的限制。

綜上所述,javascript在執行時的步驟是:

1、先讀入第一段程式碼區塊

2、對程式碼區塊進行語法分析,如果出現語法錯誤,直接執行第5步驟

3、對var變數和function定義的函數進行「預編譯處理」(賦值式函數是不會進行預編譯處理的)

4、執行程式碼區塊,有錯則報錯

5.如果還有下一段程式碼區塊,則讀入下一段程式碼區塊,重複步驟2

6、結束

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn