凡是使用function FunctionName(){}這種方式定義的函數,瀏覽器會預先把他們提取出來分析,而後再執行其餘的代碼。 當你定義了兩個相同的函數時,後面的會覆蓋前面的。 詳細以下(爲了方便說明,我加了行號): <script> 1 function A(){alert(1);} 2 A(); 3 function A(){alert(2);} 4 A(); 5 A = function(){alert(3);} 6 A(); </script> 執行的順序: 1行 >> 3行 >> 2行 >> 4行 >> 5行 >> 6行; 由於瀏覽器會預先執行function ***(){};這樣的代碼。因此執行完第一行就繼續尋找相似「function ***(){};」這樣結構的代碼,所以上例就跳過第二行執先行了第三行,當執行完第三行時,第一行定義的function A已經被第三行覆蓋。而第5行雖然A的值是一個函數,可是它是以變量的形式聲明的,所以不會被預先執行。也就是說只有以function關鍵字開頭聲明的函數會被預先執行。
這 就是JavaScript執 行順序致使的。JavaScript執行引擎並不是一行一行地分析和執行程序,而是一段一段地分析執行的。並且在分析執行同一段 代碼中,定義式的函數語句會被提取出來優先執行。函數定義執行完後,纔會按順序執行其餘代碼。也就是說,在第一次調用hello函數以前,第一個函數語句 定義的代碼已經被第二個函數定義語句的代碼覆蓋了,這就是爲何在例子2中第一次調用hallo時,也會輸出後面定義的函數內容的緣由了。瀏覽器
以上是正常狀況。函數
若是涉及到Ajax請求,你得設置同步的屬性,才能保證語句能夠順序(同步)執行。url
http://blog.csdn.net/a7458969/article/details/6328751.net
看完以後,知道了js的預編譯和執行階段的概念,真是一篇很不錯的文章。code
最後還提到了用document.write導入js時可能產生的瀏覽器兼容問題以及解決辦法。惋惜對這種用法不熟,沒看懂。
blog