我剛剛瞭解到有關執行javascript的一個重要事實,以防萬一拋出錯誤。在我開始對此作出結論之前,我最好驗證一下我是否正確。如果前面的腳本失敗,JavaScript代碼段執行或不執行
鑑於包括2個腳本的HTML頁面:
<script src="script1.js" />
<script src="script2.js" />
SCRIPT1:
doSomething();
SCRIPT2:
doSomeOtherThing();
這有效地導致被處理作爲一個單元的單一腳本:
doSomething();
doSomeOtherThing();
特別是,如果doSomething
引發錯誤,則執行被破壞。 'script2'永遠不會被執行。
這是我的「第1課」 - 有人可能會認爲它是一個單獨包含的文件,它不受script1的影響。
但它是。
=>見下文
「晚更新」 現在,如果我們改變SCRIPT2如下(假設我們有包括上述地方的jQuery):
$(document).ready({ doSomeOtherThing(); });
和SCRIPT2之前把腳本:
<script src="script2.js" />
<script src="script1.js" />
執行順序是有效還是 'doSomething的()' 後(有時)由 'doSomeOtherThing()'。
然而,在兩個「單位」被執行:
doSomething
早在文檔的Java腳本doSomeOtherThing
的一部分,執行時被處理的document.ready事件被執行。
如果doSomeOtherThing
拋出異常,它將不打破第二處理「單元」。
(我使用術語thread
不要因爲我覺得所有的腳本通常由同一個線程執行的,或者更準確地說,這可能依賴於瀏覽器)
所以,我Lession 2:即使盡管JavaScript錯誤可能會阻止任何後續腳本執行,但它不會停止事件循環。
結論1
$(document).ready()
確實在確定應在隨後的執行獨立於任何其他腳本的JavaScript代碼塊的非常出色。換句話說,如果您有一段JavaScript並且要確保即使其他腳本失敗,也要執行該腳本,請將其放在$(document).ready()
之內。
這對我來說是新的,因爲如果腳本取決於文檔被完全加載,我只會使用該事件。
結論2
把它更進了一步,可能是一個很好的架構決定換一個內$(document).ready()
所有腳本,以確保所有的腳本都「排隊」的執行。另外,在上述第二示例中,如果script2.js
被列入後script1.js
如實施例1:
<script src="script1.js" />
<script src="script2.js" />
在script1.js錯誤將防止甚至正在註冊的doSomeOtherThing()
,因爲$(document).ready()
功能將不被執行。
但是,如果script1.js使用$(document).ready()
,也不會發生這種情況:
$(document).ready(function() { doSomething(); });
$(document).ready(function() { doSomeOtherThing(); });
這兩條線會被處決。然後稍後事件循環將執行doSomething
這將破壞,但doSomeOtherThing
不會受到影響。
這樣做的另一個原因是,呈現頁面的線程可以儘快返回,並且可以使用事件循環來觸發代碼執行。
批判/問題:
- 難道我錯了?
- 是什麼原因導致需要立即執行,即不是將其包裝到事件中?
- 它會顯着影響性能嗎?
- 是否有另一種/更好的方式來實現相同的而不是使用文檔就緒事件?
- 如果所有腳本只是將其代碼註冊爲事件處理程序,是否可以定義腳本的執行順序?事件處理程序是否按照它們註冊的順序執行?
期待任何有用的意見!
後期更新:
像Briguy37指出正確的,我的觀察一定是錯擺在首位。 (「我錯了 - 是的!」)。以他的簡單例子,我可以在所有主流瀏覽器甚至IE8中重現,即使script1引發錯誤,腳本2也會執行。
不過@馬塞羅的偉大的答案可以幫助病人在執行堆棧等等的概念,一些有識之士這似乎只是每兩個腳本在單獨執行堆棧執行。
感謝您的所有發現。非常非常有用的閱讀+1 –
@Beto - 感謝您的讚賞。不幸的是,我的觀察被證明是錯誤我現在更新了我的問題和接受的答案。隨時退休upvote。 – chiccodoro
Hi @chiccodoro!我讀了你的文章作爲開始,然後我閱讀所有的答案。並不是所有的發現都是錯誤的,它有助於我更好地理解其他更技術性的答案。無論如何,謝謝! –