2014-08-28 70 views
6

我有類似下面的代碼:history.back()之後的代碼會發生什麼?

window.history.back(); 
myFunction(10); 
  • history.back()阻塞/非阻塞電話嗎?

  • 是否有保證myFunction()將被執行?還是不會執行?

  • 這是一個可能的競爭條件,其中history.back()異步發生和 是否myFunction()被稱爲依賴於不可控事件的時機?

+0

有趣的問題,但什麼是你對此事的經歷?你自己試過這個嗎? – Peter 2014-08-28 07:29:02

+2

這是一個很好的問題!閱讀[規範](http://www.w3.org/TR/2011/WD-html5-20110113/history.html#traverse-the-history-by-a-delta),可以調用「myFunction」if 'BeforeUnloadEvent'至少取消導航 – CodingIntrigue 2014-08-28 07:30:14

+0

@Peter函數運行;但是我想確定。 – teddbytee 2014-08-28 07:35:05

回答

5

spechistory.backqueues a task

因此,在主要的event loop的下一次運行期間,將會執行實際的歷史操作代碼(這是JS實現內部的)。您致電myFunction在本輪執行中同步執行,因此它將始終在兼容的環境中執行。

但是,只有myFunction中的同步代碼才能保證執行。考慮這個例子:

function myFunction() { 
    console.log('synchronous'); 
    debugger 

    setTimeout(function() { 
    console.log('async'); 
    debugger 
    }) 
} 

window.history.back(); 
myFunction(); 

第一個調試器語句總是被命中。第二個,推遲到未來的事件循環使用setTimeout滴答,不會。

This article是JavaScript事件循環的一個很好的解釋