history.back()之后的代码会发生什么?

时间:2014-08-28 07:25:35

标签: javascript asynchronous concurrency

我的代码如下:

window.history.back();
myFunction(10);
  • history.back()是阻止/非阻止呼叫吗?

  • 是否可以确保执行myFunction()?或者不会被执行?

  • 这是history.back()异步发生的可能竞争条件吗? 是否调用myFunction()取决于不可控事件的时间安排?

1 个答案:

答案 0 :(得分:6)

spec表示history.back queues 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事件循环的一个很好的解释