首页 文章 精选 留言 我的

精选列表

搜索[javascript],共10000篇文章
优秀的个人博客,低调大师

JavaScript 中的事件循环与微任务:一次代码执行顺序的排查记录

前几天在项目里遇到一个奇怪的现象:一个按钮点击后,先更新了状态,然后通过 Promise 触发了一个日志上报,但日志里的数据却是旧的。排查后发现,问题出在微任务和事件循环的配合上。很多人对 setTimeout、Promise.then、queueMicrotask 的执行顺序停留在背诵面试题的层面,一旦放进真实代码里,尤其是和 DOM 更新、异步请求、状态管理库混在一起,就很容易写出意料之外的行为。这篇文章会从一次实际的竞态问题出发,梳理浏览器事件循环中宏任务与微任务的调度规则,并用可运行的代码说明 Promise 回调、MutationObserver 和 queueMicrotask 在页面渲染前后的时机差异。最后给出几个在 React/Vue 项目中避免这类陷阱的编码习惯。 ## 从一段日志上报的代码说起 当时的代码简化后是这样: ```js let currentId = 1 function handleClick() { currentId = 2 Promise.resolve().then(() => { report(currentId) }) currentId = 3 } function report(id) { console.log('上报的 id:', id) } handleClick() // 输出 3 ``` 直觉上可能会觉得上报的是 2,但实际输出 3。Promise.then 是微任务,它不会在 `currentId = 2` 之后立刻执行,而是等当前同步代码全部跑完,才从微任务队列里取出来。所以赋值 3 先执行,等微任务运行时读到的自然是 3。 这个问题在真实项目里更隐蔽:状态管理库的更新、Vue 的 nextTick、React 的 setState 批处理,都依赖类似的调度机制。如果在上报里直接引用一个会被后续同步代码修改的变量,数据就错了。修复方式很简单——在创建微任务之前把值固定下来: ```js function handleClick() { currentId = 2 const idToReport = currentId Promise.resolve().then(() => { report(idToReport) }) currentId = 3 } ``` ## 事件循环里到底发生了什么 浏览器的事件循环每轮大概做这几件事: 1. 从宏任务队列取出一个任务执行,比如 script 整体代码、setTimeout 回调、用户交互回调。 2. 执行过程中产生的微任务全部推入微任务队列。 3. 当前宏任务结束后,清空微任务队列,直到队列为空。 4. 如果有需要,执行渲染步骤(样式计算、布局、绘制)。 5. 进入下一轮,可能处理 requestAnimationFrame 回调,然后继续取宏任务。 关键点在于:微任务在渲染之前清空,requestAnimationFrame 在渲染之前调用,而 setTimeout 属于下一个宏任务,通常在渲染之后。这意味着如果你在微任务里改 DOM,浏览器还没机会绘制,所以用户看不到中间状态。 用下面这段代码可以直接观察顺序: ```html ``` 输出顺序是:`script start` → `script end` → `promise` → `rAF` → `setTimeout`。注意 rAF 并不保证每轮都执行,它取决于浏览器是否准备渲染,但在这个简单场景里它排在微任务之后、setTimeout 之前。 ## queueMicrotask 和 MutationObserver 的时机 `queueMicrotask` 和 `Promise.resolve().then` 基本等价,都是往微任务队列添加任务,但前者语义更清晰,也不会有 Promise 被拒绝时未捕获的警告干扰。如果你只是想让一段逻辑在当前同步代码后、渲染前执行,用 queueMicrotask 比 Promise 更合适。 MutationObserver 也是微任务级别的回调。以前有人用它来模拟 nextTick,比如: ```js let callbacks = [] const observer = new MutationObserver(() => { callbacks.forEach(cb => cb()) callbacks = [] }) const node = document.createTextNode('') observer.observe(node, { characterData: true }) function nextTick(cb) { callbacks.push(cb) node.data = '1' } ``` 这样做在大多数情况下没问题,但 MutationObserver 的回调触发时机和 Promise 微任务在规范里属于同一个微任务检查点,只是不同浏览器实现细节略有差异。现代开发里除非维护老代码,否则直接使用 queueMicrotask 或框架提供的 nextTick 就足够了。 ## 在框架项目里容易踩的坑 ### Vue 的 nextTick 与数据更新 Vue 2 和 Vue 3 都利用微任务来批量更新 DOM。看这个例子: ```js // Vue 3 setup 中 const count = ref(0) function increment() { count.value++ console.log(document.querySelector('.count').textContent) // 0 nextTick(() => { console.log(document.querySelector('.count').textContent) // 1 }) } ``` 直接读 DOM 拿到的是旧值,因为 DOM 更新被推到微任务里。如果需要在更新后做测量或上报,必须放在 nextTick 里。但要注意:如果在 nextTick 回调里再次修改响应式数据,会触发新的更新,可能造成循环,最好在修改前判断清楚。 ### React 的 setState 批处理 React 18 之前,在事件处理函数里多次 setState 会被合并;在 setTimeout 或原生 Promise 里则不会。React 18 启用自动批处理后,所有地方都统一批处理。下面这段代码在 React 18 里只会渲染一次: ```jsx function App() { const [a, setA] = useState(0) const [b, setB] = useState(0) function handleClick() { Promise.resolve().then(() => { setA(1) setB(2) }) } console.log('render') return click } ``` 但如果你在状态更新后立刻读取 state,拿到的还是旧值。这和微任务无关,而是 React 状态更新的快照机制。需要基于最新状态做操作时,用函数式更新或 useEffect。 ## 实际项目中的几个处理习惯 编写异步回调时,把需要的数据在进入微任务前就固定下来,不要依赖外层的可变变量。日志上报、埋点、状态快照尤其要注意。 需要操作 DOM 并读取布局信息时,区分“更新前”和“更新后”。在框架里,更新后读取用 nextTick、useEffect 或 flushSync 等对应方案,而不是直接写同步代码。 想延迟到下一轮事件循环,用 setTimeout;想在本轮同步代码后、渲染前执行,用 queueMicrotask 或 Promise.resolve().then。两者混用时要清楚它们不在同一个队列里。 如果一段逻辑既可能在宏任务里触发,也可能在微任务里触发,最好把它统一成一个函数,内部按需调度,避免顺序随机。比如封装一个 `scheduleReport`,用 queueMicrotask 保证它在当前操作结束后执行一次,而不是到处写 Promise。 这些规则本身不复杂,难的是代码规模变大后,多个异步链路交织在一起时还能保持顺序可预测。遇到执行顺序不符合预期时,先画一下当前宏任务里有哪些同步代码、哪些微任务,通常就能定位到问题。 推荐查看天气:https://www.40tianqi.com/gaize/10tian.html 推荐查看天气:https://www.40tianqi.com/gaize/15tian.html 推荐查看天气:https://www.40tianqi.com/gaize/40tian.html 推荐查看天气:https://www.40tianqi.com/cuoqin/ 推荐查看天气:https://www.40tianqi.com/cuoqin/zuotian.html 推荐查看天气:https://www.40tianqi.com/cuoqin/7tian.html 推荐查看天气:https://www.40tianqi.com/cuoqin/10tian.html 推荐查看天气:https://www.40tianqi.com/cuoqin/15tian.html 推荐查看天气:https://www.40tianqi.com/cuoqin/40tian.html 推荐查看天气:https://www.40tianqi.com/linzhi/ 推荐查看天气:https://www.40tianqi.com/linzhi/zuotian.html 推荐查看天气:https://www.40tianqi.com/linzhi/7tian.html 推荐查看天气:https://www.40tianqi.com/linzhi/10tian.html 推荐查看天气:https://www.40tianqi.com/linzhi/15tian.html 推荐查看天气:https://www.40tianqi.com/linzhi/40tian.html 推荐查看天气:https://www.40tianqi.com/gongbujiangda/ 推荐查看天气:https://www.40tianqi.com/gongbujiangda/zuotian.html 推荐查看天气:https://www.40tianqi.com/gongbujiangda/7tian.html 推荐查看天气:https://www.40tianqi.com/gongbujiangda/10tian.html 推荐查看天气:https://www.40tianqi.com/gongbujiangda/15tian.html 推荐查看天气:https://www.40tianqi.com/gongbujiangda/40tian.html 推荐查看天气:https://www.40tianqi.com/milin/ 推荐查看天气:https://www.40tianqi.com/milin/zuotian.html 推荐查看天气:https://www.40tianqi.com/milin/7tian.html 推荐查看天气:https://www.40tianqi.com/milin/10tian.html 推荐查看天气:https://www.40tianqi.com/milin/15tian.html 推荐查看天气:https://www.40tianqi.com/milin/40tian.html 推荐查看天气:https://www.40tianqi.com/motuo/ 推荐查看天气:https://www.40tianqi.com/motuo/zuotian.html 推荐查看天气:https://www.40tianqi.com/motuo/7tian.html 推荐查看天气:https://www.40tianqi.com/motuo/10tian.html 推荐查看天气:https://www.40tianqi.com/motuo/15tian.html 推荐查看天气:https://www.40tianqi.com/motuo/40tian.html 推荐查看天气:https://www.40tianqi.com/bomi/ 推荐查看天气:https://www.40tianqi.com/bomi/zuotian.html 推荐查看天气:https://www.40tianqi.com/bomi/7tian.html 推荐查看天气:https://www.40tianqi.com/bomi/10tian.html 推荐查看天气:https://www.40tianqi.com/bomi/15tian.html 推荐查看天气:https://www.40tianqi.com/bomi/40tian.html 推荐查看天气:https://www.40tianqi.com/chayu/ 推荐查看天气:https://www.40tianqi.com/chayu/zuotian.html 推荐查看天气:https://www.40tianqi.com/chayu/7tian.html 推荐查看天气:https://www.40tianqi.com/chayu/10tian.html 推荐查看天气:https://www.40tianqi.com/chayu/15tian.html 推荐查看天气:https://www.40tianqi.com/chayu/40tian.html 推荐查看天气:https://www.40tianqi.com/langxian/ 推荐查看天气:https://www.40tianqi.com/langxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/langxian/7tian.html 推荐查看天气:https://www.40tianqi.com/langxian/10tian.html 推荐查看天气:https://www.40tianqi.com/langxian/15tian.html 推荐查看天气:https://www.40tianqi.com/langxian/40tian.html 推荐查看天气:https://www.40tianqi.com/xian/ 推荐查看天气:https://www.40tianqi.com/xian/zuotian.html 推荐查看天气:https://www.40tianqi.com/xian/7tian.html 推荐查看天气:https://www.40tianqi.com/xian/10tian.html 推荐查看天气:https://www.40tianqi.com/xian/15tian.html 推荐查看天气:https://www.40tianqi.com/xian/40tian.html 推荐查看天气:https://www.40tianqi.com/xincheng/ 推荐查看天气:https://www.40tianqi.com/xincheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/xincheng/7tian.html 推荐查看天气:https://www.40tianqi.com/xincheng/10tian.html 推荐查看天气:https://www.40tianqi.com/xincheng/15tian.html 推荐查看天气:https://www.40tianqi.com/xincheng/40tian.html 推荐查看天气:https://www.40tianqi.com/beilin/ 推荐查看天气:https://www.40tianqi.com/beilin/zuotian.html 推荐查看天气:https://www.40tianqi.com/beilin/7tian.html 推荐查看天气:https://www.40tianqi.com/beilin/10tian.html 推荐查看天气:https://www.40tianqi.com/beilin/15tian.html 推荐查看天气:https://www.40tianqi.com/beilin/40tian.html 推荐查看天气:https://www.40tianqi.com/lianhu/ 推荐查看天气:https://www.40tianqi.com/lianhu/zuotian.html 推荐查看天气:https://www.40tianqi.com/lianhu/7tian.html 推荐查看天气:https://www.40tianqi.com/lianhu/10tian.html 推荐查看天气:https://www.40tianqi.com/lianhu/15tian.html 推荐查看天气:https://www.40tianqi.com/lianhu/40tian.html 推荐查看天气:https://www.40tianqi.com/baqiao/ 推荐查看天气:https://www.40tianqi.com/baqiao/zuotian.html 推荐查看天气:https://www.40tianqi.com/baqiao/7tian.html 推荐查看天气:https://www.40tianqi.com/baqiao/10tian.html 推荐查看天气:https://www.40tianqi.com/baqiao/15tian.html 推荐查看天气:https://www.40tianqi.com/baqiao/40tian.html 推荐查看天气:https://www.40tianqi.com/weiyang/ 推荐查看天气:https://www.40tianqi.com/weiyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/weiyang/7tian.html 推荐查看天气:https://www.40tianqi.com/weiyang/10tian.html 推荐查看天气:https://www.40tianqi.com/weiyang/15tian.html 推荐查看天气:https://www.40tianqi.com/weiyang/40tian.html 推荐查看天气:https://www.40tianqi.com/yanta/ 推荐查看天气:https://www.40tianqi.com/yanta/zuotian.html 推荐查看天气:https://www.40tianqi.com/yanta/7tian.html 推荐查看天气:https://www.40tianqi.com/yanta/10tian.html 推荐查看天气:https://www.40tianqi.com/yanta/15tian.html 推荐查看天气:https://www.40tianqi.com/yanta/40tian.html 推荐查看天气:https://www.40tianqi.com/yanliang/ 推荐查看天气:https://www.40tianqi.com/yanliang/zuotian.html 推荐查看天气:https://www.40tianqi.com/yanliang/7tian.html 推荐查看天气:https://www.40tianqi.com/yanliang/10tian.html 推荐查看天气:https://www.40tianqi.com/yanliang/15tian.html 推荐查看天气:https://www.40tianqi.com/yanliang/40tian.html 推荐查看天气:https://www.40tianqi.com/lintong/ 推荐查看天气:https://www.40tianqi.com/lintong/zuotian.html 推荐查看天气:https://www.40tianqi.com/lintong/7tian.html 推荐查看天气:https://www.40tianqi.com/lintong/10tian.html 推荐查看天气:https://www.40tianqi.com/lintong/15tian.html 推荐查看天气:https://www.40tianqi.com/lintong/40tian.html 推荐查看天气:https://www.40tianqi.com/changan/ 推荐查看天气:https://www.40tianqi.com/changan/zuotian.html 推荐查看天气:https://www.40tianqi.com/changan/7tian.html 推荐查看天气:https://www.40tianqi.com/changan/10tian.html 推荐查看天气:https://www.40tianqi.com/changan/15tian.html 推荐查看天气:https://www.40tianqi.com/changan/40tian.html 推荐查看天气:https://www.40tianqi.com/lantian/ 推荐查看天气:https://www.40tianqi.com/lantian/zuotian.html 推荐查看天气:https://www.40tianqi.com/lantian/7tian.html 推荐查看天气:https://www.40tianqi.com/lantian/10tian.html 推荐查看天气:https://www.40tianqi.com/lantian/15tian.html 推荐查看天气:https://www.40tianqi.com/lantian/40tian.html 推荐查看天气:https://www.40tianqi.com/zhouzhi/ 推荐查看天气:https://www.40tianqi.com/zhouzhi/zuotian.html 推荐查看天气:https://www.40tianqi.com/zhouzhi/7tian.html 推荐查看天气:https://www.40tianqi.com/zhouzhi/10tian.html 推荐查看天气:https://www.40tianqi.com/zhouzhi/15tian.html 推荐查看天气:https://www.40tianqi.com/zhouzhi/40tian.html 推荐查看天气:https://www.40tianqi.com/huxian/ 推荐查看天气:https://www.40tianqi.com/huxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/huxian/7tian.html 推荐查看天气:https://www.40tianqi.com/huxian/10tian.html 推荐查看天气:https://www.40tianqi.com/huxian/15tian.html 推荐查看天气:https://www.40tianqi.com/huxian/40tian.html 推荐查看天气:https://www.40tianqi.com/gaoling/ 推荐查看天气:https://www.40tianqi.com/gaoling/zuotian.html 推荐查看天气:https://www.40tianqi.com/gaoling/7tian.html 推荐查看天气:https://www.40tianqi.com/gaoling/10tian.html 推荐查看天气:https://www.40tianqi.com/gaoling/15tian.html 推荐查看天气:https://www.40tianqi.com/gaoling/40tian.html 推荐查看天气:https://www.40tianqi.com/tongchuan/ 推荐查看天气:https://www.40tianqi.com/tongchuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/tongchuan/7tian.html 推荐查看天气:https://www.40tianqi.com/tongchuan/10tian.html 推荐查看天气:https://www.40tianqi.com/tongchuan/15tian.html 推荐查看天气:https://www.40tianqi.com/tongchuan/40tian.html 推荐查看天气:https://www.40tianqi.com/wangyi/ 推荐查看天气:https://www.40tianqi.com/wangyi/zuotian.html 推荐查看天气:https://www.40tianqi.com/wangyi/7tian.html 推荐查看天气:https://www.40tianqi.com/wangyi/10tian.html 推荐查看天气:https://www.40tianqi.com/wangyi/15tian.html 推荐查看天气:https://www.40tianqi.com/wangyi/40tian.html 推荐查看天气:https://www.40tianqi.com/yintai/ 推荐查看天气:https://www.40tianqi.com/yintai/zuotian.html 推荐查看天气:https://www.40tianqi.com/yintai/7tian.html 推荐查看天气:https://www.40tianqi.com/yintai/10tian.html 推荐查看天气:https://www.40tianqi.com/yintai/15tian.html 推荐查看天气:https://www.40tianqi.com/yintai/40tian.html 推荐查看天气:https://www.40tianqi.com/yaozhou/ 推荐查看天气:https://www.40tianqi.com/yaozhou/zuotian.html 推荐查看天气:https://www.40tianqi.com/yaozhou/7tian.html 推荐查看天气:https://www.40tianqi.com/yaozhou/10tian.html 推荐查看天气:https://www.40tianqi.com/yaozhou/15tian.html 推荐查看天气:https://www.40tianqi.com/yaozhou/40tian.html 推荐查看天气:https://www.40tianqi.com/yijun/ 推荐查看天气:https://www.40tianqi.com/yijun/zuotian.html 推荐查看天气:https://www.40tianqi.com/yijun/7tian.html 推荐查看天气:https://www.40tianqi.com/yijun/10tian.html 推荐查看天气:https://www.40tianqi.com/yijun/15tian.html 推荐查看天气:https://www.40tianqi.com/yijun/40tian.html 推荐查看天气:https://www.40tianqi.com/baoji/ 推荐查看天气:https://www.40tianqi.com/baoji/zuotian.html 推荐查看天气:https://www.40tianqi.com/baoji/7tian.html 推荐查看天气:https://www.40tianqi.com/baoji/10tian.html 推荐查看天气:https://www.40tianqi.com/baoji/15tian.html 推荐查看天气:https://www.40tianqi.com/baoji/40tian.html 推荐查看天气:https://www.40tianqi.com/weibin/ 推荐查看天气:https://www.40tianqi.com/weibin/zuotian.html 推荐查看天气:https://www.40tianqi.com/weibin/7tian.html 推荐查看天气:https://www.40tianqi.com/weibin/10tian.html 推荐查看天气:https://www.40tianqi.com/weibin/15tian.html 推荐查看天气:https://www.40tianqi.com/weibin/40tian.html 推荐查看天气:https://www.40tianqi.com/jintai/ 推荐查看天气:https://www.40tianqi.com/jintai/zuotian.html 推荐查看天气:https://www.40tianqi.com/jintai/7tian.html 推荐查看天气:https://www.40tianqi.com/jintai/10tian.html 推荐查看天气:https://www.40tianqi.com/jintai/15tian.html 推荐查看天气:https://www.40tianqi.com/jintai/40tian.html 推荐查看天气:https://www.40tianqi.com/chencang/ 推荐查看天气:https://www.40tianqi.com/chencang/zuotian.html 推荐查看天气:https://www.40tianqi.com/chencang/7tian.html 推荐查看天气:https://www.40tianqi.com/chencang/10tian.html 推荐查看天气:https://www.40tianqi.com/chencang/15tian.html 推荐查看天气:https://www.40tianqi.com/chencang/40tian.html 推荐查看天气:https://www.40tianqi.com/fengxiang/ 推荐查看天气:https://www.40tianqi.com/fengxiang/zuotian.html 推荐查看天气:https://www.40tianqi.com/fengxiang/7tian.html 推荐查看天气:https://www.40tianqi.com/fengxiang/10tian.html 推荐查看天气:https://www.40tianqi.com/fengxiang/15tian.html 推荐查看天气:https://www.40tianqi.com/fengxiang/40tian.html 推荐查看天气:https://www.40tianqi.com/qishan/ 推荐查看天气:https://www.40tianqi.com/qishan/zuotian.html 推荐查看天气:https://www.40tianqi.com/qishan/7tian.html 推荐查看天气:https://www.40tianqi.com/qishan/10tian.html 推荐查看天气:https://www.40tianqi.com/qishan/15tian.html

优秀的个人博客,低调大师

JavaScript 中 Date 对象的时区陷阱:从一次线上活动时间错乱说起

运营同学在后台配置了一个秒杀活动,开始时间选择的是 2025-06-01 00:00:00,结果到了 6 月 1 日凌晨,前端页面依然显示活动未开始,而部分用户却能正常下单。排查后发现,服务器返回的是 UTC 时间字符串,浏览器 `new Date('2025-06-01T00:00:00Z')` 解析没问题,但运营后台直接用了 `new Date('2025-06-01 00:00:00')` 这种非标准格式,在 Safari 和 Chrome 上行为不一致,Safari 直接返回 Invalid Date。更隐蔽的是,把 Date 对象用 `toISOString()` 转回字符串时,它总是输出 UTC,导致本地时间看起来“少了一天”。这类问题在跨时区、跨浏览器、以及和后端联调时反复出现。本文会拆解 Date 的解析规则、时区偏移、序列化差异,并给出几个在真实项目里减少这类错误的写法。 ## 为什么 `new Date('2025-06-01 00:00:00')` 不可靠 ECMAScript 规范里,Date 构造函数接受两种字符串:一种符合 ISO 8601 格式,另一种是实现自定义的格式。`'2025-06-01 00:00:00'` 这种用空格分隔日期和时间的写法,并不在标准要求必须解析的范围内。Chrome 和 Node.js 会把它当作本地时间解析,Safari 和旧版 Firefox 可能直接返回 `Invalid Date`。 ```js // 在 Chrome / Node 中 new Date('2025-06-01 00:00:00').toString() // 'Sun Jun 01 2025 00:00:00 GMT+0800 (中国标准时间)' // 在 Safari 中 new Date('2025-06-01 00:00:00').toString() // 'Invalid Date' ``` 如果字符串里带 `T`,比如 `'2025-06-01T00:00:00'`,规范规定没有时区偏移时按本地时间解析,兼容性就好很多。再带上 `Z` 或 `+08:00`,就是明确的绝对时间点。 ```js new Date('2025-06-01T00:00:00') // 本地时间,各浏览器表现一致 new Date('2025-06-01T00:00:00Z') // UTC 时间 new Date('2025-06-01T00:00:00+08:00') // 东八区时间 ``` 后端接口返回时间时,最好统一用 ISO 8601 带时区偏移的格式,前端不要自己拼字符串。 ## `toISOString()` 不等于“我看到的本地时间” `toISOString()` 永远返回 UTC 时间,格式固定为 `YYYY-MM-DDTHH:mm:ss.sssZ`。很多人用它来做格式化,结果发现比本地时间少了 8 小时。 ```js const d = new Date('2025-06-01T00:00:00+08:00') console.log(d.toISOString()) // '2025-05-31T16:00:00.000Z' console.log(d.toString()) // 'Sun Jun 01 2025 00:00:00 GMT+0800' ``` 如果只是用于传输或存储,`toISOString()` 是合适的。但用于展示,就得配合 `Intl.DateTimeFormat` 或者自己按本地时区拼。 ```js function formatLocal(date) { const y = date.getFullYear() const m = String(date.getMonth() + 1).padStart(2, '0') const d = String(date.getDate()).padStart(2, '0') const hh = String(date.getHours()).padStart(2, '0') const mm = String(date.getMinutes()).padStart(2, '0') const ss = String(date.getSeconds()).padStart(2, '0') return `${y}-${m}-${d} ${hh}:${mm}:${ss}` } ``` 注意 `getMonth()` 返回 0-11,`getDate()` 才是几号,这两个方法名很容易写错。 ## 时区偏移:`getTimezoneOffset()` 的符号反直觉 `getTimezoneOffset()` 返回的是 UTC 与本地时间的分钟差,但符号是反的:东八区返回 -480,西五区返回 300。 ```js // 在东八区 new Date().getTimezoneOffset() // -480 ``` 如果要做“把本地时间转成另一个时区显示”,最稳的是用 `Intl.DateTimeFormat` 指定 `timeZone`。 ```js const date = new Date('2025-06-01T00:00:00Z') new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', dateStyle: 'full', timeStyle: 'long' }).format(date) // '2025年6月1日星期日 08:00:00 GMT+8' new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date) // 'Saturday, May 31, 2025 at 8:00:00 PM EDT' ``` `Intl` 在现代浏览器和 Node.js 中已经足够可用。如果要做倒计时或者跨时区活动,不要手动加减小时数,夏令时会让固定偏移出错。 ## 一个真实的活动时间处理片段 假设后端返回 `{ startTime: '2025-06-01T00:00:00+08:00', endTime: '2025-06-01T02:00:00+08:00' }`,前端需要判断当前是否在活动时间内,并显示本地时间。 ```js function isActivityActive(activity) { const now = Date.now() const start = new Date(activity.startTime).getTime() const end = new Date(activity.endTime).getTime() return now >= start && now 推荐查看天气:https://www.0dtq.com/xinlin/15tian.html 推荐查看天气:https://www.0dtq.com/xinlin/40tian.html 推荐查看天气:https://www.0dtq.com/huzhong/ 推荐查看天气:https://www.0dtq.com/huzhong/zuotian.html 推荐查看天气:https://www.0dtq.com/huzhong/7tian.html 推荐查看天气:https://www.0dtq.com/huzhong/10tian.html 推荐查看天气:https://www.0dtq.com/huzhong/15tian.html 推荐查看天气:https://www.0dtq.com/huzhong/40tian.html 推荐查看天气:https://www.0dtq.com/huma/ 推荐查看天气:https://www.0dtq.com/huma/zuotian.html 推荐查看天气:https://www.0dtq.com/huma/7tian.html 推荐查看天气:https://www.0dtq.com/huma/10tian.html 推荐查看天气:https://www.0dtq.com/huma/15tian.html 推荐查看天气:https://www.0dtq.com/huma/40tian.html 推荐查看天气:https://www.0dtq.com/tahe/ 推荐查看天气:https://www.0dtq.com/tahe/zuotian.html 推荐查看天气:https://www.0dtq.com/tahe/7tian.html 推荐查看天气:https://www.0dtq.com/tahe/10tian.html 推荐查看天气:https://www.0dtq.com/tahe/15tian.html 推荐查看天气:https://www.0dtq.com/tahe/40tian.html 推荐查看天气:https://www.0dtq.com/mohe/ 推荐查看天气:https://www.0dtq.com/mohe/zuotian.html 推荐查看天气:https://www.0dtq.com/mohe/7tian.html 推荐查看天气:https://www.0dtq.com/mohe/10tian.html 推荐查看天气:https://www.0dtq.com/mohe/15tian.html 推荐查看天气:https://www.0dtq.com/mohe/40tian.html 推荐查看天气:https://www.0dtq.com/shanghai/ 推荐查看天气:https://www.0dtq.com/shanghai/zuotian.html 推荐查看天气:https://www.0dtq.com/shanghai/7tian.html 推荐查看天气:https://www.0dtq.com/shanghai/10tian.html 推荐查看天气:https://www.0dtq.com/shanghai/15tian.html 推荐查看天气:https://www.0dtq.com/shanghai/40tian.html 推荐查看天气:https://www.0dtq.com/xuhui/ 推荐查看天气:https://www.0dtq.com/xuhui/zuotian.html 推荐查看天气:https://www.0dtq.com/xuhui/7tian.html 推荐查看天气:https://www.0dtq.com/xuhui/10tian.html 推荐查看天气:https://www.0dtq.com/xuhui/15tian.html 推荐查看天气:https://www.0dtq.com/xuhui/40tian.html 推荐查看天气:https://www.0dtq.com/hongkou/ 推荐查看天气:https://www.0dtq.com/hongkou/zuotian.html 推荐查看天气:https://www.0dtq.com/hongkou/7tian.html 推荐查看天气:https://www.0dtq.com/hongkou/10tian.html 推荐查看天气:https://www.0dtq.com/hongkou/15tian.html 推荐查看天气:https://www.0dtq.com/hongkou/40tian.html 推荐查看天气:https://www.0dtq.com/yangpu/ 推荐查看天气:https://www.0dtq.com/yangpu/zuotian.html 推荐查看天气:https://www.0dtq.com/yangpu/7tian.html 推荐查看天气:https://www.0dtq.com/yangpu/10tian.html 推荐查看天气:https://www.0dtq.com/yangpu/15tian.html 推荐查看天气:https://www.0dtq.com/yangpu/40tian.html 推荐查看天气:https://www.0dtq.com/minxing/ 推荐查看天气:https://www.0dtq.com/minxing/zuotian.html 推荐查看天气:https://www.0dtq.com/minxing/7tian.html 推荐查看天气:https://www.0dtq.com/minxing/10tian.html 推荐查看天气:https://www.0dtq.com/minxing/15tian.html 推荐查看天气:https://www.0dtq.com/minxing/40tian.html 推荐查看天气:https://www.0dtq.com/baoshanqu/ 推荐查看天气:https://www.0dtq.com/baoshanqu/zuotian.html 推荐查看天气:https://www.0dtq.com/baoshanqu/7tian.html 推荐查看天气:https://www.0dtq.com/baoshanqu/10tian.html 推荐查看天气:https://www.0dtq.com/baoshanqu/15tian.html 推荐查看天气:https://www.0dtq.com/baoshanqu/40tian.html 推荐查看天气:https://www.0dtq.com/jiading/ 推荐查看天气:https://www.0dtq.com/jiading/zuotian.html 推荐查看天气:https://www.0dtq.com/jiading/7tian.html 推荐查看天气:https://www.0dtq.com/jiading/10tian.html 推荐查看天气:https://www.0dtq.com/jiading/15tian.html 推荐查看天气:https://www.0dtq.com/jiading/40tian.html 推荐查看天气:https://www.0dtq.com/pudong/ 推荐查看天气:https://www.0dtq.com/pudong/zuotian.html 推荐查看天气:https://www.0dtq.com/pudong/7tian.html 推荐查看天气:https://www.0dtq.com/pudong/10tian.html 推荐查看天气:https://www.0dtq.com/pudong/15tian.html 推荐查看天气:https://www.0dtq.com/pudong/40tian.html 推荐查看天气:https://www.0dtq.com/jinshan/ 推荐查看天气:https://www.0dtq.com/jinshan/zuotian.html 推荐查看天气:https://www.0dtq.com/jinshan/7tian.html 推荐查看天气:https://www.0dtq.com/jinshan/10tian.html 推荐查看天气:https://www.0dtq.com/jinshan/15tian.html 推荐查看天气:https://www.0dtq.com/jinshan/40tian.html 推荐查看天气:https://www.0dtq.com/songjiang/ 推荐查看天气:https://www.0dtq.com/songjiang/zuotian.html 推荐查看天气:https://www.0dtq.com/songjiang/7tian.html 推荐查看天气:https://www.0dtq.com/songjiang/10tian.html 推荐查看天气:https://www.0dtq.com/songjiang/15tian.html 推荐查看天气:https://www.0dtq.com/songjiang/40tian.html 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/ 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/zuotian.html 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/7tian.html 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/10tian.html 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/15tian.html 推荐查看天气:https://www.0dtq.com/shanghaiqingpu/40tian.html 推荐查看天气:https://www.0dtq.com/shanghaifengxian/ 推荐查看天气:https://www.0dtq.com/shanghaifengxian/zuotian.html 推荐查看天气:https://www.0dtq.com/shanghaifengxian/7tian.html 推荐查看天气:https://www.0dtq.com/shanghaifengxian/10tian.html 推荐查看天气:https://www.0dtq.com/shanghaifengxian/15tian.html 推荐查看天气:https://www.0dtq.com/shanghaifengxian/40tian.html 推荐查看天气:https://www.0dtq.com/chongming/ 推荐查看天气:https://www.0dtq.com/chongming/zuotian.html 推荐查看天气:https://www.0dtq.com/chongming/7tian.html 推荐查看天气:https://www.0dtq.com/chongming/10tian.html 推荐查看天气:https://www.0dtq.com/chongming/15tian.html 推荐查看天气:https://www.0dtq.com/chongming/40tian.html 推荐查看天气:https://www.0dtq.com/nanjing/ 推荐查看天气:https://www.0dtq.com/nanjing/zuotian.html 推荐查看天气:https://www.0dtq.com/nanjing/7tian.html 推荐查看天气:https://www.0dtq.com/nanjing/10tian.html 推荐查看天气:https://www.0dtq.com/nanjing/15tian.html 推荐查看天气:https://www.0dtq.com/nanjing/40tian.html 推荐查看天气:https://www.0dtq.com/xuanwu/ 推荐查看天气:https://www.0dtq.com/xuanwu/zuotian.html 推荐查看天气:https://www.0dtq.com/xuanwu/7tian.html 推荐查看天气:https://www.0dtq.com/xuanwu/10tian.html 推荐查看天气:https://www.0dtq.com/xuanwu/15tian.html 推荐查看天气:https://www.0dtq.com/xuanwu/40tian.html 推荐查看天气:https://www.0dtq.com/qinhuai/ 推荐查看天气:https://www.0dtq.com/qinhuai/zuotian.html 推荐查看天气:https://www.0dtq.com/qinhuai/7tian.html 推荐查看天气:https://www.0dtq.com/qinhuai/10tian.html 推荐查看天气:https://www.0dtq.com/qinhuai/15tian.html 推荐查看天气:https://www.0dtq.com/qinhuai/40tian.html 推荐查看天气:https://www.0dtq.com/jianye/ 推荐查看天气:https://www.0dtq.com/jianye/zuotian.html 推荐查看天气:https://www.0dtq.com/jianye/7tian.html 推荐查看天气:https://www.0dtq.com/jianye/10tian.html 推荐查看天气:https://www.0dtq.com/jianye/15tian.html 推荐查看天气:https://www.0dtq.com/jianye/40tian.html 推荐查看天气:https://www.0dtq.com/pukou/ 推荐查看天气:https://www.0dtq.com/pukou/zuotian.html 推荐查看天气:https://www.0dtq.com/pukou/7tian.html 推荐查看天气:https://www.0dtq.com/pukou/10tian.html 推荐查看天气:https://www.0dtq.com/pukou/15tian.html 推荐查看天气:https://www.0dtq.com/pukou/40tian.html 推荐查看天气:https://www.0dtq.com/yuhuatai/ 推荐查看天气:https://www.0dtq.com/yuhuatai/zuotian.html 推荐查看天气:https://www.0dtq.com/yuhuatai/7tian.html 推荐查看天气:https://www.0dtq.com/yuhuatai/10tian.html 推荐查看天气:https://www.0dtq.com/yuhuatai/15tian.html 推荐查看天气:https://www.0dtq.com/yuhuatai/40tian.html 推荐查看天气:https://www.0dtq.com/jiangning/ 推荐查看天气:https://www.0dtq.com/jiangning/zuotian.html 推荐查看天气:https://www.0dtq.com/jiangning/7tian.html 推荐查看天气:https://www.0dtq.com/jiangning/10tian.html 推荐查看天气:https://www.0dtq.com/jiangning/15tian.html 推荐查看天气:https://www.0dtq.com/jiangning/40tian.html 推荐查看天气:https://www.0dtq.com/liuhe/ 推荐查看天气:https://www.0dtq.com/liuhe/zuotian.html 推荐查看天气:https://www.0dtq.com/liuhe/7tian.html 推荐查看天气:https://www.0dtq.com/liuhe/10tian.html 推荐查看天气:https://www.0dtq.com/liuhe/15tian.html 推荐查看天气:https://www.0dtq.com/liuhe/40tian.html 推荐查看天气:https://www.0dtq.com/nanjinglishui/ 推荐查看天气:https://www.0dtq.com/nanjinglishui/zuotian.html 推荐查看天气:https://www.0dtq.com/nanjinglishui/7tian.html 推荐查看天气:https://www.0dtq.com/nanjinglishui/10tian.html 推荐查看天气:https://www.0dtq.com/nanjinglishui/15tian.html 推荐查看天气:https://www.0dtq.com/nanjinglishui/40tian.html 推荐查看天气:https://www.0dtq.com/gaochun/ 推荐查看天气:https://www.0dtq.com/gaochun/zuotian.html 推荐查看天气:https://www.0dtq.com/gaochun/7tian.html 推荐查看天气:https://www.0dtq.com/gaochun/10tian.html 推荐查看天气:https://www.0dtq.com/gaochun/15tian.html 推荐查看天气:https://www.0dtq.com/gaochun/40tian.html 推荐查看天气:https://www.0dtq.com/wuxi/ 推荐查看天气:https://www.0dtq.com/wuxi/zuotian.html 推荐查看天气:https://www.0dtq.com/wuxi/7tian.html 推荐查看天气:https://www.0dtq.com/wuxi/10tian.html 推荐查看天气:https://www.0dtq.com/wuxi/15tian.html 推荐查看天气:https://www.0dtq.com/wuxi/40tian.html 推荐查看天气:https://www.0dtq.com/wuxixishan/ 推荐查看天气:https://www.0dtq.com/wuxixishan/zuotian.html 推荐查看天气:https://www.0dtq.com/wuxixishan/7tian.html 推荐查看天气:https://www.0dtq.com/wuxixishan/10tian.html 推荐查看天气:https://www.0dtq.com/wuxixishan/15tian.html 推荐查看天气:https://www.0dtq.com/wuxixishan/40tian.html 推荐查看天气:https://www.0dtq.com/huishan/ 推荐查看天气:https://www.0dtq.com/huishan/zuotian.html 推荐查看天气:https://www.0dtq.com/huishan/7tian.html 推荐查看天气:https://www.0dtq.com/huishan/10tian.html 推荐查看天气:https://www.0dtq.com/huishan/15tian.html 推荐查看天气:https://www.0dtq.com/huishan/40tian.html 推荐查看天气:https://www.0dtq.com/binhu/ 推荐查看天气:https://www.0dtq.com/binhu/zuotian.html 推荐查看天气:https://www.0dtq.com/binhu/7tian.html 推荐查看天气:https://www.0dtq.com/binhu/10tian.html 推荐查看天气:https://www.0dtq.com/binhu/15tian.html 推荐查看天气:https://www.0dtq.com/binhu/40tian.html 推荐查看天气:https://www.0dtq.com/jiangyin/ 推荐查看天气:https://www.0dtq.com/jiangyin/zuotian.html 推荐查看天气:https://www.0dtq.com/jiangyin/7tian.html 推荐查看天气:https://www.0dtq.com/jiangyin/10tian.html 推荐查看天气:https://www.0dtq.com/jiangyin/15tian.html 推荐查看天气:https://www.0dtq.com/jiangyin/40tian.html 推荐查看天气:https://www.0dtq.com/yixing/ 推荐查看天气:https://www.0dtq.com/yixing/zuotian.html 推荐查看天气:https://www.0dtq.com/yixing/7tian.html 推荐查看天气:https://www.0dtq.com/yixing/10tian.html 推荐查看天气:https://www.0dtq.com/yixing/15tian.html 推荐查看天气:https://www.0dtq.com/yixing/40tian.html

优秀的个人博客,低调大师

(鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向!

开篇语 忽然有一种感觉,每次学习一个知识点就像是谈一场恋爱:从初次邂逅,到彼此了解,一切都那么的符合恋爱的过程! 如果这个知识点再有点”调皮“的话,那简直是让人欲仙欲死而又不可自拔!因为你永远不知道它还有多少面纱等着你揭开,当你自以为对它已经足够了解的时候,冷不防就是一个盲点迎面砸来。 它简直就像一个”宝藏女孩“,你要时刻做好迎接”惊喜“的准备! 可能正是因为这种新鲜感,我才能一直保持一种类似亢奋的状态吧。当然,这只是针对知识而言,对待情感我还是很保守很专一的<( ̄︶ ̄)> 这两天,我就在和定时器谈恋爱,哦不,是在学习定时器( ̄▽ ̄)~*,可没想到,又给陷进去了…… 这不,上一篇文章写完定时器的返回值后,刚觉得自己对它已经了解的清清楚楚明明白白了,够我炫耀一阵子了,谁成想,喘口气的功夫,它又给我整出了幺蛾子。 惑起 写完上篇文章后,我就琢磨着里面的实现代码还可以优化一下,于是给改成了下面这个样子: <form action="" class="example-form"> <div> <label for="name"> 名称 </label> <input class="input-ele" type="text" name="name" id="name" placeholder="please input your name" autocomplete="off"> </div> <div style="margin-top:50px;"> <label for="res"> 输入 </label> <textarea class="input-ele" type="multipart" name="res" id="res" readonly placeholder="这里是每一次输入的结果"></textarea> </div> </form> <script> window.onload = function () { const resEle = document.querySelector("#res"); function changeOutputVal() { resEle.value += `\n${ this.value }`; } function throttle(fun, delay) { let last, deferTimer return function () { let now = Date.now(); if (last && now < last + delay) { clearTimeout(deferTimer); deferTimer = setTimeout(function () { last = now; fun.apply(this); }, delay) } else { last = now; fun.apply(this); } } } const inputEle = document.querySelector("#name"); inputEle.addEventListener("input", throttle(changeOutputVal, 1000)); } </script> 我的修改依据是: throttle 方法返回的是一个匿名函数,这个函数正好充当 input 事件的回调函数 input 事件回调函数中的 this 指向的是 inputEle 匿名函数中将 this 绑定给了 fun 参数,而实际使用中传入的是 changeOutputVal 方法 所以 changeOutputVal 方法中的 this 指的就是 inputEle,所以在它里面可以通过 this.value 获取到 inputEle 的值 看,这逻辑多严谨,简直头头是道啊 \( ̄︶ ̄)/ 按理说,是没问题的吧,结果却出问题了。欲知详情,请看大屏幕: 这个 undefined 是什么鬼?!从哪冒出来的?难道我的延时器没用对? 解惑 面对我的质疑,setTimeout 理直气壮地说:人家回调函数中的 this 本来就是指向 window 对象的嘛,你也没早问啊! 那么,问题来了:为什么延时器中的 this 指向的是 window 呢?setTimeout 自己也解释不清楚了。 得,看来前人诚不我欺也——自己动手,丰衣足食! 凡事不决找 MDN,绝对靠谱!我们来看看 MDN 怎么说: 由setTimeout()调用的代码运行在与所在函数完全分离的执行环境上。这会导致,这些代码中包含的 this 关键字在非严格模式会指向 window (或全局)对象,严格模式下为 undefined,这和所期望的this的值是不一样的。 看到这个解释,我才明白:this 指向 window 对象,原来是因为执行环境的不同导致的。 在上面的代码中,因为 window 对象没有 value 这个属性,所以 window.value = undefined。 感觉自己在专业的方向上又迈进了一小步,容我小小地嘚瑟一下! 改错 既然知道问题出在哪,那就好办了,我们只需要将 setTimeout 回到函数内部的 this 指向改变一下就好,这里有以下方案。 使用变量引用外部 this 关键代码如下: window.onload = function () { // some code here const that = this; deferTimer = setTimeout(function () { last = now; fun.apply(that); }, delay) // some code here } 使用箭头函数 利用箭头函数不会改变 this 的指向的特性,改造如下: window.onload = function () { // some code here deferTimer = setTimeout(() => { last = now; fun.apply(this); }, delay) // some code here } 结束语 知错能改,善莫大焉! 写到这里,我居然体会到了古人那种”朝闻道,夕死可矣“的满足感。 在编程这条路上,可能遍布荆棘,但只要我们勤耕不辍,总能开辟出属于自己的康庄大道! 这鸡汤太美味,我先干为敬,你们随意!b( ̄▽ ̄)d ~ ~ ~ 本文完,感谢阅读! ~ 学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂! 我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教! 你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠! 知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

优秀的个人博客,低调大师

WebStorm 2020.2 Beta 2 发布:支持 Nuxt.js、为 JavaScript 和 TypeScript 增加的新意图

WebStorm 2020.2 Beta 2 已发布,此版本的部分更新亮点包括: 支持Nuxt.js 此版本增加了对Nuxt.js的支持,Nuxt.js是一个基于 Vue 构建的流行框架。如果使用的Nuxt.js 版本高于2.9.0并且没有安装@nuxt/types软件包,则 WebStorm 会进行警告并建议将其安装为 dev 依赖项。如果希望 IDE 具有更好的代码补全功能,建议参考下面的操作: 当使用nuxt.config.js文件时,现在会得到正确的代码补全建议。在悬停时,还会看到弹出的文档,并显示文件中使用的Nuxt选项的类型信息。 现在还支持 Nuxt 特有的 webpack 设置。从 Nuxt.js 2.12.0 开始,WebStorm 会自动找到 webpack 配置文件,并使用其中的模块解析规则进行编码辅助。对于早于 2.12.0 的版本,可以从这里复制脚本,并将 WebStorm 指向它,以达到同样的效果。 除此之外,WebStorm 现在支持所有核心的 Nuxt.js 组件,可提供代码补全建议和相关的文档(在鼠标悬停时触发)。IDE 还能识别对 Vuex store 的引用,并进行正确解析和自动完成。 最后,所有放入静态目录并在 Vue 模板中以 <img src="/logo.png"/> 格式引用的 assets资源也将会在 Nuxt.js 项目中得到正确解析。 围绕 Optional Chaining 和 null 判断合并(Nullish Coalescing)的新意图 除了最近增加的将代码转换为 Optional Chaining 和/或 nullish coalescing 的意图之外,WebStorm 2020.2还带来了一个新的意图,它的作用正好相反。比方说,我们改变了主意,想把初始代码找回来添加一个额外的条件。有了新的意图,此操作可以轻松完成!在希望转换的表达式上放上逗号,按下 Alt+Enter 键,然后选择展开 Optional Chaining 和 Nullish Coalescing。 这并不是增加唯一的新意图。现在,我们可以在 if/else 条件语句中快速将代码转换为 Optional Chaining 和 Nullish Coalescing。这将适用于此类语句中使用的逻辑运算符,也适用于嵌套的 if 语句。在要转换的表达式上按 Alt+Enter 键,然后选择相应的意图。 详情查看发布公告。

优秀的个人博客,低调大师

【JavaScript】通过封装自己的JSONP解决浏览器的跨域问题(Ajax跨域)

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/82701029 问题引出:要发送Ajax请求,就必须使用HTTP请求?什么是跨域问题? 什么是跨域问题:如果两个页面中的协议、域名、端口、子域名任意有一项不同,两者之间所进行的访问行动就是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。 如何解决呢? 1. 使用创建DOM元素的方式创建img对象, audio, video, link 这几个对象都支持跨域请求,。 var img = new Image(); img.src = 'http://192.168.1.105:8080?name=zhangsan&age=18'; 类似于上面的这种呢?还有其他一些类似的标签,实际上是可以向服务器发送请求的,但是不能拿到返回值 2. 使用link标签, 但是也不能拿到服务器的请求, 然后再试试script这个标签来试试看??? <link rel="stylesheet" href=""> link标签只能支持css的格式,其他格式的内容浏览器是显示不出来的 3.使用script标签来实现跨域, 也能满足发送数据的要求, 接受数据呢?来测试一下。 var script = document.createElement('script'); script.src = 'http://192.168.1.105:8080?name=zhangsan&age=18'; document.body.appendChild(script); // 开始正式发送请求 经测试,还是真可以的,而且在客户端也成功接受到了数据,这说明我们终于找对了路! 4.解决没有加载完成就输出的问题( 这样就会等待到script标签加载完成之后执行) // 在返回数据到客户端之前,先进行字符串拼接 let json = JSON.stringify({ id: 1, name: 'zhangsan', age: 18, gender: 'Male' }); let jsonStr = 'var data = ' + json; 上面的是我们服务器的数据, 我们直接通过字符串拼接json,然后发给浏览器。 console.log(data) 直接输出,我们发现报错了,找不到这个变量??? 原因是因为,浏览器自上而下执行代码,如果DOM元素没有加载完毕就输出,坑定会报错的 5.解决没有加载完成就输出的问题( 这样就会等待到script标签加载完成之后执行) script.addEventListener('load', function () { console.log(data); }); 直接绑定个事件不就行了,测试以后还真是可以。 但是,缺点是: 这种方式需要服务器端定义一个全局变量, 从而会污染全局变量, 不太推荐………… 6. 上面的思路逻辑和代码优化, 由于脚本执行过后才可以拿到数据, 上面的代码可以优化吗? var script = document.createElement('script'); script.src = 'http://192.168.1.105:8080?name=zhangsan&age=18'; document.body.appendChild(script); function callback(data) { console.log(data) } 实现原理: 服务器端实际上是返回了一个callback函数的调用, 类似于callback(jsondata), 因此当且仅当服务器断点数据返回来以后, 下面的这个函数就相当于是自动调用了, 就会直接得到服务器端传回来的数据信息, 从而打印输出数据。 服务器端就是这样的: let jsonFunc = `callback(${json})`; 7.代码的继续优化, 可以直接在请求中, 我要自己定义一个函数呢?函数名我要自己指定的方法, 可以直接写在url请求中。 var script1 = document.createElement('script'); var url = 'http://192.168.1.105:8080?name=zhangsan&age=19&callback=callback1'; script1.src = url; document.body.appendChild(script1); function callback1(data) { console.log(data); } 服务器端进行参数解析,换成用户自己定义的函数名字不就行了? let callback = urlObj.query.callback; let jsonFunc = ''+callback+'' + '('+ json + ')'; 到此,浏览器的跨域问题已经基本全部解决。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册