2015-05-04 118 views
1

導航到新的html頁面後,瀏覽器中的JavaScript執行何時停止?請問Javascript執行何時停止?

window.location = "index.html"; 

仍然會執行?包含這一行的函數是否返回?當有一個XMLHttpRequest正在運行時,onreadystatechange回調會在帶有回調代碼的頁面被保留之後仍然被調用嗎?或者setTimeout調用的回調?這是很好的定義?

+1

你爲什麼不自己嘗試一下,看.. – Zee

+0

@ Sourabh-因爲他不是要求執行*行爲,而是理論*行爲/定義。 – Siguza

+0

我需要一些我可以依賴的東西(不同的瀏覽器或版本),我正在檢查文檔,但沒有找到答案。 – Gerhard

回答

2

當您導航到新頁面時,現有頁面將完全關閉。 Javascript上下文被停止並被丟棄。在幾行代碼完成變量之後,這種關閉是否立即發生。在啓動新頁面加載時,它可能與某些異步時間有關。

多年來,在設置新位置後,一些瀏覽器如何處理接下來的幾行代碼有一些細微的差別,但是您不應該在設置新位置後指望任何行執行,因爲設置新位置正在告訴瀏覽器關閉此頁面並開始加載一個新頁面。

Chrome中的快速測試顯示下一行中的alert()會在完成加載下一個位置之前執行並等待用戶輸入,但這是未記錄的行爲並且不安全。

在Firefox中,警報短暫地在屏幕上閃爍,但不等待用戶輸入並加載新頁面。


聰明的辦法代碼是不放置任何代碼設置window.location後。這樣,您不會依賴於瀏覽器之間的行爲,所有瀏覽器的行爲都與您的代碼相同。如果您想執行其他操作,請在更改window.location之前執行此操作。或者,如果你希望你當前的代碼塊執行完畢,然後更改一個setTimeout()的位置,如:

setTimeout(function() { 
    window.location = "http://www.stackoverflow.com"; 
}, 1); 

這則可靠地讓執行完成的當前線程的頁面被改成了新的前位置,因爲setTimeout()通過事件隊列工作,直到當前的執行線程完成後(無論完成需要多長時間),事件纔會被處理。

+1

我不會依靠超時,如果下面有很長的代碼。我認爲,下面的代碼可能會被超時函數中斷。 – Gerhard

+1

@Gerhard - 瀏覽器中的Javascript是單線程的(除了沒有參與討論的webWorkers)。計時器永遠不會中斷正在運行的Javascript執行線程。當計時器觸發時,事件將被添加到Javascript事件隊列中,並且只有在當前執行線程完成並且下一個事件從隊列中彈出時纔會處理該事件。請參閱[本文](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)以獲取有關該主題的更多參考資料。 – jfriend00

+0

@Gerhard - 所以當處理事件隊列上的下一個事件時,會在當前執行線程完成後始終發生setTimeout()。這是如何設計和構建Javascript事件管理和排序的基本方面。很多代碼取決於這種行爲。 – jfriend00