今天作為前端小菜跑去某廠面試,結果以失敗告終。
記得面試官問我在一個頁面中js的執行順序問題,結果由于自己并沒有研究過,所以不太清楚,糊里糊涂的結果把自己都說亂了。在網上查了一堆文章之后還是覺得應該由自己敲出來測試一下。下面貼一下測試代碼和結果。
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>test js</title> 6 <script type="text/javascript"> 7 alert("<head>標簽中第一個內置js代碼段,位于鏈接js的前面。" ); 8 </script> 9 <script type="text/javascript" src="a1.js"></script> 10 <script type="text/javascript" src="a2.js"></script> 11 <script type="text/javascript"> 12 alert("<head>標簽中第二個內置js代碼段,位于鏈接js的后面。" ); 13 </script> 14 </head> 15 16 <body onload="b()"> 17 <script defer> 18 alert("defer中的代碼段。" ); 19 </script> 20 21 <script> 22 alert("body 中的 js 代碼段。" ); 23 </script> 24 25 <script> 26 function b(){ 27 alert("b函數中的js代碼段。" ); 28 } 29 </script> 30 31 <script> 32 alert("body 中的第二個 js 代碼段。" ); 33 </script> 34 35 </body> 36 <script> 37 alert("body 之外的 js 代碼段。" ); 38 </script> 39 </html> 40 <script> 41 alert("html 之外的 js 代碼段。" ); 42 </script>
下面是a1.js的內容:
1 // JavaScript Document 2 alert("<head>標簽中鏈接過來的a1.js中的代碼。");
下面是a2.js的內容:
// JavaScript Document alert("<head>標簽中鏈接過來的a2.js中的代碼。");
測試結果(alert的順序)是:js的執行順序基本上按照在html中出現的順序,但是也有一些細小的變化。
1.首先執行<head>標簽中的js,不論是內置還是外鏈形式,都是按照出現的順序執行。
2.接著執行body中的腳本,按順序直到<html>標簽外。
3.然后執行defer="defer"的腳本。(IE中測試支持,chrome和firefox都不支持defer屬性,在這兩個瀏覽器中,將作為正常的腳本段按順序執行)。
4.最后執行body的onload方法b()。
另外:(轉自: http://www.cnblogs.com/Jason-Damon/archive/2011/11/12/2246483.html )
JavaScript執行引擎并非一行一行地分析和執行程序,而是 一段一段 的分析執行的。而且在分析執行同一段代碼中, 定義式 的函數語句會被提取出來優先執行。函數定義執行完后,才會按順序執行其他代碼。
先看看兩個例子:
例子1:
<script> var hello = function (){ alert( 'hello,zhangsan' ); } hello(); // 第一次調用,輸出“hello,zhangsan” var hello = function (){ alert( 'hello,lisi' ); } hello(); // 第二次調用,輸出“hello,lisi” <script>
例子2:
1 <script type="text/javascript"> 2 function hello(){ 3 4 alert('hello,zhangsan' ); 5 6 } 7 8 hello(); // 第一次調用,輸出hello,lisi 9 10 function hello(){ 11 12 alert('hello,lisi' ); 13 14 } 15 16 hello(); // 第二次調用,輸出hello,lisi 17 </script>
例子3:
1 <script type="text/javascript"> 2 function hello(){ 3 4 alert('hello,zhangsan' ); 5 6 } 7 8 hello(); // 第一次調用,輸出hello,zhangsan 9 </script> 10 <script> 11 function hello(){ 12 13 alert('hello,lisi' ); 14 15 } 16 hello(); //第二次調用,輸出hello,lisi 17 </script>
在例子2中,兩次調用都會輸出相同的內容“hello,lisi”。同樣是聲明兩個相同名稱的函數,為什么調用的結果卻不一樣呢?
這 就是JavaScript執行順序導致的。JavaScript執行引擎并非一行一行地分析和執行程序,而是一段一段地分析執行的。而且在分析執行同一段 代碼中,定義式的函數語句會被提取出來優先執行。函數定義執行完后,才會按順序執行其他代碼。也就是說,在第一次調用hello函數之前,第一個函數語句 定義的代碼已經被第二個函數定義語句的代碼覆蓋了,這就是為什么在例子2中第一次調用hallo時,也會輸出后面定義的函數內容的原因了。
而在例子3中,兩次調用分別在兩個不同的代碼段內,所以互不影響。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
