麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

淺談JavaScript 的執(zhí)行順序

2019-11-20 11:53:32
字體:
供稿:網(wǎng)友

雖然現(xiàn)代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關(guān)系,他們的執(zhí)行依然是按照引入順序進行的。

本文章記錄本人在學(xué)習 JavaScript 中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復(fù)習。

在 html 文檔中的執(zhí)行順序

js代碼執(zhí)行順序比較的形象,用戶可以直觀的感受這種執(zhí)行順序。但是,js代碼的執(zhí)行順序是比較復(fù)雜的。有時候我們會把js代碼寫在html里面,而html文檔在瀏覽器中解析的過程是這樣:瀏覽器按照文檔流從上到下逐步解析頁面結(jié)構(gòu)和信息。js代碼作為嵌入的腳本也算做html文檔的組成部分,因此,js代碼在裝載時的執(zhí)行順序也是根據(jù)腳本標簽<script>的出現(xiàn)來順序來決定。(下面一個栗子)

<!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屬性導(dǎo)入的外部js文件腳本,它也將按照其語句出現(xiàn)的順序來執(zhí)行,而且執(zhí)行過程是文檔裝載的一部分,不會因為是外部js文件而延期執(zhí)行。

// 先加載 b.js 并且執(zhí)行里面的代碼<script src="b.js"></script>// 然后在按順序執(zhí)行下面的代碼<script>  console.log(1);</script>

預(yù)編譯

當js引擎解析的時候,它會在預(yù)編譯對所有聲明的變量和函數(shù)進行處理。

變量提升

console.log(a); // undefinedvar a = 1;console.log(a); // 1

預(yù)解析函數(shù)

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

詳細:javascript變量聲明提升(hoisting)

分塊執(zhí)行代碼

js是按塊執(zhí)行代碼的,所謂代碼塊就是使用<script>標簽分隔的代碼段。(下面一個栗子)

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

因為js是按代碼塊來執(zhí)行的。瀏覽器在解析html文檔流的時候,如果遇到一個<script>標簽,則js會等到這個代碼塊都加載完之后再對代碼進行預(yù)編譯,然后在執(zhí)行。執(zhí)行完畢后,瀏覽器會繼續(xù)解析西門的html文檔流,同時js也準備好處理下一個代碼塊。

有個小坑,由于js是按塊執(zhí)行的,因此在一個js塊中調(diào)用后面塊聲明的變量或者函數(shù)就會提示語法錯誤。但是不同塊都屬于一個全局作用域,也就是說,塊之間的變量和函數(shù)是可以共享的。(下面一個栗子)

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

由于js是按塊處理代碼,同時又遵循h(huán)tml文檔流的解析順序,因此在上面的栗子中會看到語法錯誤。但是,在文檔流加載完畢后再次訪問就不會出現(xiàn)這種錯誤了。(下面一個栗子)

<script>  window.onload = function(){ // 頁面初始化事件處理函數(shù)    // 代碼段1    console.log(a);    f();  }</script><script>  // 代碼段2  var a = 1;  function f() {    console.log(1);  };</script>

還有為了安全起見,一般在頁面初始化完畢之后才允許js代碼執(zhí)行,這樣就可以避免一些網(wǎng)速對js執(zhí)行的影響。同時,也避開了html文檔流對js執(zhí)行的限制。

綜上所述,javascript在執(zhí)行時的步驟是:

1、先讀入第一段代碼塊

2、對代碼塊進行語法分析,如果出現(xiàn)語法錯誤,直接執(zhí)行第5步驟

3、對var變量和function定義的函數(shù)進行“預(yù)編譯處理”(賦值式函數(shù)是不會進行預(yù)編譯處理的)

4、執(zhí)行代碼塊,有錯則報錯

5、如果還有下一段代碼塊,則讀入下一段代碼塊,重復(fù)步驟2

6、結(jié)束

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品成人av片免费看最爱 | 国产精品视频一区二区三区四区五区 | 久久精品一二三区白丝高潮 | 国产精品久久久久久久av三级 | 九九福利视频 | 色网免费观看 | 中文字幕专区高清在线观看 | 久久久噜噜噜久久熟有声小说 | 午夜视频在线免费播放 | 久国产| 亚洲成人免费网站 | 久久久av亚洲男天堂 | 色av综合在线 | 美女露100%无遮挡 | 久久久久久久久国产 | 99ri精品 | 香蕉在线看 | 国产88久久久国产精品免费二区 | 一级做a爱视频 | 久色亚洲 | 欧洲成人一区 | 免费三级大片 | 水卜樱一区二区av | 精选久久 | 欧美一级黄色免费 | 夜添久久精品亚洲国产精品 | 日韩黄色免费在线观看 | 国产免费中文字幕 | 一区二区三区视频在线播放 | 欧美人一级淫片a免费播放 久久久久久久久91 国产99久久久久久免费看 | 欧美色视频免费 | 欧美日本一 | 久久久久久久久淑女av国产精品 | 日本黄色a视频 | 在线播放免费人成毛片乱码 | 精品国产乱码久久久久久久 | 国内久久久久 | 毛片免费在线视频 | 美女污污在线观看 | 香蕉国产9 | 国产九色在线播放九色 |