我有如下代码:
window.history.back();
myFunction(10);
history.back()
是阻塞 / 非阻塞调用吗?是否有保证
myFunction()
将被执行?还是不会被执行?这是一种可能出现的竞态条件,其中
history.back()
异步发生,而myFunction()
是否被调用取决于无法控制的事件的时间。
我有如下代码:
window.history.back();
myFunction(10);
history.back()
是阻塞 / 非阻塞调用吗?
是否有保证 myFunction()
将被执行?还是不会被执行?
这是一种可能出现的竞态条件,其中 history.back()
异步发生,而 myFunction()
是否被调用取决于无法控制的事件的时间。
history.back
排队任务。myFunction
的调用会在当前执行轮回中同步执行,因此在符合要求的环境中,它将始终被执行。myFunction
可以被执行。请考虑以下示例:function myFunction() {
console.log('synchronous');
debugger
setTimeout(function() {
console.log('async');
debugger
})
}
window.history.back();
myFunction();
第一个调试语句总是会被命中。第二个调试语句使用 setTimeout
推迟到未来的事件循环中执行,因此不会立刻被命中。
这篇文章 对 JavaScript 事件循环进行了很好的解释。
BeforeUnloadEvent
至少取消了导航,myFunction
可能会被调用。 - CodingIntrigue