qrobot 最近的时间轴更新
qrobot's repos on GitHub
TypeScript · 0 人关注
ant-design
An enterprise-class UI design language and React UI library
C · 0 人关注
Divert
WinDivert: Windows Packet Divert
0 人关注
fabric.js
Javascript Canvas Library, SVG-to-Canvas (& canvas-to-SVG) Parser
C · 0 人关注
libxlsxwriter
A C library for creating Excel XLSX files.
Go · 0 人关注
outline-go-tun2socks
Rust · 0 人关注
pipeline
0 人关注
rich-markdown-editor
The open source React and Prosemirror based markdown editor that powers Outline. Want to try it out? Create an account:
0 人关注
rust_xlsxwriter
A Rust library for creating Excel XLSX files.
Shell · 0 人关注
scripts
HTML · 0 人关注
SummaryOfLoanSuspension
全国各省市停贷通知汇总
TypeScript · 0 人关注
test
qrobot

qrobot

V2EX 第 548928 号会员,加入于 2021-06-21 14:10:57 +08:00
今日活跃度排名 15137
qrobot 最近回复了
@Plumbiu 以前我验证过 setTimeout 在部分情况下会直接被优化, 包括 setInterval 优化的策略根据浏览器的版本也有所区别. 和 w3c 规定不太一样
@Plumbiu 不说 XMLHttpRequest 这点时间不同执行顺序不同, 都不用考虑, 但是异步任务中 js 的异步队列中并不是按照 按照顺序执行的. 据我所知的在 edge 和 chome 上都有不同的差异, 在 firefox 上也有差异, 你不能信任 ecmascript 的异步队列.
@Plumbiu ecmascript 只是把任务交给浏览器去执行, 但是未必固定了任务是有序的, 和浏览器的实现有关, 虽然 w3c 固定了任务序列. 但是实际上执行上是有差异的. 例如 edge 的节能模式下 setTimeout 执行上就存在问题
@Plumbiu 看了一些 w3c 的规定, 任务队列中规定了执行顺序. 这一点我搞错了, 我一直以为是按照浏览器对任务队列的实现来说, 没有规定任务队列的顺序
@Plumbiu 就算不算 XMLHttpRequest, 连 setTimeout 都不保证依次执行
@Plumbiu 你怎么保证 XMLHttpRequest 执行依次调用 post 接口是依次执行的?
```
// 但是他又使用了一个闭包, 访问外部的环境, 但是外部的环境会根据返回的结果进行改变.
oldcontent = oldcontent.replace(ret['oldimgurl'], ret['newimgurl']);
```

这里就是 访问外部的变量, 但是外部的变量会根据返回的结果发生改变. 所以这里获得数据就会产生变化.不会按照逻辑走
@Plumbiu 异步执行, 完成的结果是具有不确定性的. 数据什么时候返回, 什么时候执行代码, 都是由 post 接口执行的时间来决定的. 本来其实也没什么问题, 但是他又使用了一个闭包, 访问外部的环境, 但是外部的环境会根据返回的结果进行改变.

var i = 0

// 五秒后 i = 1
// 六秒后 i = 2

那么 i = 1, i = 2

如果结果返回的时间变化了


// 五秒后 i = 2
// 六秒后 i = 1

那么 i = 2, i = 1

内部闭包改变了外部变量, 自然不会按照 for 循环的次数进行改变, 而是按照 callback 回调的时间进行改变.

我才说是 闭包 + 异步回调才会有这个问题.
console.log(1)
setTimeout(() => console.log(2))
console.log(3)

输出结果顺序是 1,3,2 为什么?

你在把这个问题回答上来, 基本上 ecmascript 就没啥大问题了, 其实这两个都是 ecmascript 的基本问题, 一个是异步,一个是闭包
@Plumbiu 那你现在理解吗? 为啥是闭包问题, 你看你的 29l 回答. 其实不是闭包问题, 而是闭包 + 异步回调导致的
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5305 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 15ms · UTC 09:20 · PVG 17:20 · LAX 02:20 · JFK 05:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.