我看了这个is-javascript-location-href-call-is-asynchronous和这个what the heck is the event loop anyway,但是没有解释href
中window.location
的定义行为:
以下是源代码中的脚本顺序:
1. DOM elements
2. <script> at the bottom having doc.ready.
3.Further <script> tags.
4. doc.ready's callback goes into the CB queue because all DOM elements are available in step 1 and there are only further script tags
(此回调保留在队列中,直到步骤3中的所有脚本完成执行并清空调用堆栈。更正?)
5. window.location.href=/error inside the fail() of sync AJAX. It does not immediately redirect. So it is async.
// synchronous wait method ~ >= 0.5sec inside this fail() method just after (for testing)
[标签:1]
6. call stack becomes empty here as there no more scripts to exec
问题::如果href
的行为也类似于事件/ XHR /超时,href
的{{1}}是否会进入事件队列?如果是这样,确切地何时? (事件,AJAX,setTimeouts已经定义了何时进入队列的行为,但是step 5
重定向呢?)
实验:如果在href
之后出现了同步等待,则step 5
重定向发生的次数“最多” 。但是“有时” href
的回调也会执行。
问题::如果doc.ready
的行为类似于事件/ XHR /超时,则它始终是href
之后的第二个队列,因此即使有同步等待,它也应该总是在doc.ready
之后执行。但这不是基于上面的实验!这样就表明doc.ready
不涉及事件队列,对吗?那么,当其他事件/ XHR /超时到来并与呼叫堆栈或事件/ CB队列相关时,href
的定义行为是什么?
答案 0 :(得分:0)
停止。 Research Javascript Event Loop。 JS线性执行代码。当遇到一个事件(通常是异步调用)时,它将被推送到“事件队列”,并且JS执行将继续进行。事件队列是“先进先出”。随时都无法知道队列中有什么,因此任何给定事件(您的href)的执行都是不可预测的-这不是“偶然”的。如果程序执行是“偶然”的,那么计算机甚至无法工作。