javascript - Javascript 执行顺序 - window.location.href 何时发生?
问题描述
我看了一下这个is-javascript-location-href-call-is-asynchronous,这到底是什么事件循环,但没有解释定义的href
行为window.location
:
以下是源代码中的脚本顺序:
DOM 元素
<script>
在底部有doc.ready
.更多
<script>
标签。doc.ready
的回调进入 CB 队列,因为所有 DOM 元素在步骤 1 中都可用,并且只有更多的脚本标签(此回调保留在队列中,直到步骤 3 中的所有脚本完成执行并清空调用堆栈。对吗?)window.location.href=/error
在fail()
同步 AJAX 里面。它不会立即重定向。所以它是异步的。
// synchronous wait method ~ >= 0.5sec
在此fail()
方法中(用于测试)[TAG: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 队列相关时,定义的行为是什么?
解决方案
停止。研究 Javascript 事件循环。JS 线性执行代码。当遇到事件(一般来说是异步调用)时,它会被推送到“事件队列”并且 JS 执行会继续进行。事件队列是“先进先出”的。任何时候都不知道队列中有什么,因此任何给定事件的执行 - 你的 href - 都是不可预测的 - 这不是“偶然的”。如果程序执行是“偶然的”,那么计算机甚至都无法工作。
推荐阅读
- asp.net-core - ASP.NET Core 2.1 身份:基于角色的授权 -> 拒绝访问
- html - 滚动禁用内容调整大小
- php - Shell 脚本可以从终端执行,但不能从 crontab
- javascript - 本地服务器中的Nodejs路径
- sql - Oracle 数据库中的 sysdate 和 dbtimezone 不同
- javascript - 如何使邮件正文超过 255 个字符?
- aws-lambda - SNS 消息多次触发对 Lambda 函数的调用(处理过程中没有错误/超时)
- javascript - javascript中的对象操作数组
- ios - iOS swift3中的安全文件夹
- svg - 如何将 SVG 转换为可以保存在后端的 JSON,然后再次调用 JSON 并将其转换为 SVG