JavaScript执行顺序-何时发生window.location.href?

时间:2018-07-22 18:26:01

标签: javascript jquery ajax javascript-events

我看了这个is-javascript-location-href-call-is-asynchronous和这个what the heck is the event loop anyway,但是没有解释hrefwindow.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的定义行为是什么?

1 个答案:

答案 0 :(得分:0)

停止。 Research Javascript Event Loop。 JS线性执行代码。当遇到一个事件(通常是异步调用)时,它将被推送到“事件队列”,并且JS执行将继续进行。事件队列是“先进先出”。随时都无法知道队列中有什么,因此任何给定事件(您的href)的执行都是不可预测的-这不是“偶然”的。如果程序执行是“偶然”的,那么计算机甚至无法工作。