探析瀏覽器執行JavaScript腳本載入與程式碼執行順序_javascript技巧
本文主要基於向HTML頁面引入JavaScript的幾種方式,分析HTML中JavaScript腳本的執行順序問題
1. 關於JavaScript腳本執行的阻塞性
JavaScript在瀏覽器中被解析和執行時具有阻塞的特性,也就是說,當JavaScript程式碼執行時,頁面的解析、渲染以及其他資源的下載都要停下來等待腳本執行完畢①。這一點是沒有爭議的,並且在所有瀏覽器中的行為都是一致的,原因也不難理解:瀏覽器需要一個穩定的DOM結構,而JavaScript可能會修改DOM(改變DOM結構或修改某個DOM節點),如果在JavaScript執行的同時還繼續進行頁面的解析,那麼整個解析過程將變得難以控制,解析出錯的可能也變得很大。
然而這裡還有一個問題需要注意,對於外部腳本,還涉及到一個腳本下載的過程,在早期的瀏覽器中,JavaScript文件的下載不僅會阻塞頁面的解析,甚至還會阻塞頁面其他資源的下載(包括其他JavaScript腳本檔案、外部CSS檔案以及圖片等外部資源)。從IE8、firefox3.5、safari4和chrome2開始允許JavaScript並行下載,同時JavaScript檔案的下載也不會阻塞其他資源的下載(舊版本中,JavaScript檔案的下載也會阻塞其他資源的下載)。
註:不同瀏覽器對於同一個網域下的最大連線數有不同的限制,HTTP1.1協定規格中的要求是不能高於2個,但是大多數瀏覽器目前實際提供的最大連線數都多於2個,IE6/7都是2個,IE8提升到了6個,firefox和chrome也是6個,當然這個設定也是可以修改的,詳細內容可以參考:http://www.stevesouders. com/blog/2008/03/20/roundup-on-parallel-connections/
2. 關於腳本的執行順序
瀏覽器是按照從上到下的順序解析頁面,因此正常情況下,JavaScript腳本的執行順序也是從上到下的,即頁面上先出現的程式碼或先被引入的程式碼總是先執行,即使是允許並行下載JavaScript檔案時也是如此。注意我們這裡標紅了"正常情況下",原因是什麼呢?我們知道,在HTML中加入JavaScript程式碼有多種方式,概括如下(不考慮requirejs或seajs等模組載入器):
(1)正常引入:即在頁面中透過<script>標籤引入腳本程式碼或引入外部腳本<br /> </script>
(2)透過document.write方法寫入頁面<script>標籤或程式碼<br /> </script>
(3)透過動態腳本技術,即利用DOM介面建立<script>元素,並設定元素的src,然後再將元素加入DOM。 <br /> </script>
(4)透過Ajax取得腳本內容,然後再建立<script>元素,並設定元素的text,再將元素加入DOM。 <br /> </script>
(5)直接把JavaScript程式碼寫在元素的事件處理程序中或直接作為URL的主體,範例如下:
<!--直接写在元素的事件处理程序中--> <input type="button" value="点击测试一下" onclick="alert('点击了按钮')"/> <!--作为URL的主体--> <a href="javascript:alert('dd')">JS脚本作为URL的主体</a>
第5種情況對於我們討論的腳本執行順序沒有什麼影響,因此我們這裡只討論前四種情況:
2.1 正常引入腳本時
正常引入腳本時,JavaScript程式碼會按照從上到下的順序執行,不管腳本是不是並行下載,執行時還是按照引入的順序從上到下執行的,我們以下面的DEMO為例:
首先,透過PHP寫了一個腳本,這個腳本接收兩個參數,檔案URL和延遲時間,腳本會在傳入的延遲時間之後,將檔案內容傳送給瀏覽器,腳本如下:
<?php $url = $_GET['url']; $delay = $_GET['delay']; if(isset($delay)){ sleep($delay); } echo file_get_contents($url); ?>
另外我們還定義了兩個JavaScript文件,分別為1.js和2.js,在這個例子中,二者的程式碼分別如下:
1.js
alert("我是第一個腳本");
2.js
alert("我是第二個腳本");
然後,我們在HTML中引入腳本程式碼:
<script src='/delayfile.php?url=http://localhost/js/load/1.js&delay=3' type='text/javascript'></script> <script type="text/javascript"> alert("我是内部脚本"); </script> <script src='/delayfile.php?url=http://localhost/js/load/2.js&delay=1' type='text/javascript'></script>
虽然第一个脚本延迟了3秒才会返回,但是在所有浏览器中,弹出的顺序也都是相同的,即:"我是第一个脚本"->"我是内部脚本"->"我是第二个脚本"
2.2 通过document.write向页面中写入脚本时
document.write在文档流没有关闭的情况下,会将内容写入脚本所在位置结束之后紧邻的位置,浏览器执行完当前短的代码,会接着解析document.write所写入的内容。
注:document.write写入内容的位置还存在一个问题,加入在
内部的脚本中写入了标签内部不应该出现的内容,比如通过document.write写入脚本时存在一些问题,需要分类进行说明:
[1]同一个

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
