2014-08-28 68 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事件循环的一个很好的解释