2013-06-01 263 views
1

瀏覽器在爲html頁面導入外部JavaScript時首先執行什麼操作?它試圖編譯它嗎?
我問這個問題,因爲我試圖先導入一個cluetip jquery js文件,然後是Jquery.js文件時出現異常。

這工作:
將外部JavaScript導入到html中

<script src="/pollweb1/jquery.js" type="text/javascript"></script> 
<script src="/pollweb1/jquery.cluetip.js " type="text/javascript"></script> 



這不起作用:

<script src="/pollweb1/jquery.cluetip.js " type="text/javascript"></script> 
<script src="/pollweb1/jquery.js" type="text/javascript"></script> 


我可以看到,對於jquery.cluetip.js工作需要的jquery.js文件。但爲什麼順序很重要?瀏覽器在導入javascript文件後是否嘗試編譯它?

+1

http:// stackoverflow。com/questions/9827652/does-order-of-javascript-import-matter – ZZPLKF

+0

在瀏覽器到達第二個腳本之前,所有第一個腳本都將被解析並執行。 – nnnnnn

+0

如果它只包含函數定義,那麼函數將不會被調用,雖然它們會被解析(它會選擇語法錯誤而不是運行時錯誤)。但是你必須調用函數_somewhere,_對嗎?大概你不會將自己的代碼添加到jquery.js中。 cluetip.js是否包含文檔準備好處理程序?或者你也在html頁面上添加JS代碼? – nnnnnn

回答

5

該命令很重要,因爲cluetip.js文件依賴於jquery.js,瀏覽器按照遇到的順序加載腳本。當瀏覽器嘗試加載cluetip.js腳本時,它會嘗試使用這些依賴關係。由於沒有加載jQuery,依賴於jQuery的語句失敗。

在附註中,Javascript是一種解釋型語言,腳本從未實際編譯過。這就是爲什麼你在運行時發現你的大部分錯誤的原因,如果它被編譯,你會在訪問你的網頁之前發現錯誤。當瀏覽器遇到腳本時,它開始執行它。大多數情況下,任何實際操作都會延遲到頁面加載完畢,所以前幾項任務主要是建立全局變量/對象,如jQuery或註冊jQuery插件。

我假設cluetip.js插件嘗試註冊jQuery,但由於尚未加載,因此無法找到它,這進一步說明了訂單的重要性。

一如既往的最佳參考是actual specification

一種方式來描繪這是一個簡短的例子。像我們有這些腳本的頁面:

OurPage.html

<head> 
    <script type="text/javascript" src="script1.js"></script> 
    <script type="text/javascript" src="script2.js"></script> 
</head> 

而且腳本:

script1.js

alert(msg); //msg is undefined 

script2.js

它試圖提醒 msg變量
var msg = "hello world"; 

瀏覽器首先加載script1.js,但是msg變量包含在其中尚未加載script2.js,因此,我們通過瀏覽器msg是不確定的通知。這就是你的例子中發生的事情,只是在更大的層面上。

+0

_「腳本從未實際編譯過」_--除了現代JS引擎實際上可能編譯某些代碼。 (一些瀏覽器有一個分階段的方法,所有的代碼被解釋爲開始,然後「熱」代碼被優化,並且「非常熱」的代碼被編譯。)並且通常整個腳本在被執行之前被解析,這就是爲什麼腳本末尾的語法錯誤可能會阻止整個腳本運行(但運行時錯誤顯然會在運行時發生)。 – nnnnnn

+1

_「因此我們被告知msg未定義」_ - 您可能不會收到警報,您可能會收到參考錯誤。 – nnnnnn

+0

@nnnnnn:jquery.cluetip.js只包含一個功能。只有在整個頁面被加載後(即在jquery.js被導入之後)才調用該函數。因爲cluettip()函數在document.ready()函數中調用。 – Ashwin