首页 > 解决方案 > Javascript 执行顺序 - window.location.href 何时发生?

问题描述

我看了一下这个is-javascript-location-href-call-is-asynchronous,这到底是什么事件循环,但没有解释定义的href行为window.location

以下是源代码中的脚本顺序:

  1. DOM 元素

  2. <script>在底部有doc.ready.

  3. 更多<script>标签。

  4. doc.ready的回调进入 CB 队列,因为所有 DOM 元素在步骤 1 中都可用,并且只有更多的脚本标签(此回调保留在队列中,直到步骤 3 中的所有脚本完成执行并清空调用堆栈。对吗?

  5. window.location.href=/errorfail()同步 AJAX 里面。它不会立即重定向。所以它是异步的。

// synchronous wait method ~ >= 0.5sec在此fail()方法中(用于测试)[TAG:1]

  1. 调用堆栈在这里变空,因为没有更多的脚本可以执行

问题:如果href也像事件/XHR/超时一样,是否href进入step 5事件队列?如果是这样,具体是什么时候?(事件、AJAX、setTimeouts 已经定义了当它进入队列时的行为,但是href重定向呢?)

实验:如果在 之后存在同步等待step 5,则href重定向“大多数”时间都会发生。但是"sometimes" doc.ready的回调也会被执行。

问题:如果href像 Event/XHR/Timeouts 这样的行为,那么它总是在队列中的第二个之后doc.ready,所以即使有同步等待,它也应该总是在之后执行doc.ready。但它并没有基于上面的实验!!所以它显示href不涉及事件队列,对吗?href那么,当其他事件/XHR/超时出现并与调用堆栈或事件/CB 队列相关时,定义的行为是什么?

标签: javascriptjqueryajaxdom-events

解决方案


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


推荐阅读