history.back()执行后代码会发生什么?

10

我有如下代码:

window.history.back();
myFunction(10);
  • history.back() 是阻塞 / 非阻塞调用吗?

  • 是否有保证 myFunction() 将被执行?还是不会被执行?

  • 这是一种可能出现的竞态条件,其中 history.back() 异步发生,而 myFunction() 是否被调用取决于无法控制的事件的时间。


有趣的问题,但是你在这方面有什么经验吗?你自己尝试过吗? - Peter
2
这是一个好问题!阅读规范,如果BeforeUnloadEvent至少取消了导航,myFunction可能会被调用。 - CodingIntrigue
@Peter 函数已经运行,但是我想确认一下。 - teddbytee
@teddbytee,当然可以:很好的问题,但是你自己在这方面的经验总是额外信息中有趣的。 - Peter
1个回答

9
“spec”表示规范,规范说明了history.back排队任务
因此,实际的历史记录操作代码(此代码为 JS 实现内部代码)将在下一个主事件循环运行期间执行。您对myFunction的调用会在当前执行轮回中同步执行,因此在符合要求的环境中,它将始终被执行。
然而,仅保证同步代码myFunction可以被执行。请考虑以下示例:
function myFunction() {
  console.log('synchronous');
  debugger

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

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

第一个调试语句总是会被命中。第二个调试语句使用 setTimeout 推迟到未来的事件循环中执行,因此不会立刻被命中。

这篇文章 对 JavaScript 事件循环进行了很好的解释。


我在运行Android 6 API 23的设备上的Chrome 40.0.0.0中发现了一个例外情况。在history.back()之后的代码不会执行。 - Dr. DS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接