乐于分享
好东西不私藏

一个 AI 引发的 bug:JavaScript 闭包陷阱

一个 AI 引发的 bug:JavaScript 闭包陷阱

前言

在一个可视化搭建编辑器项目中,我们通过代码块控制页面节点的显示状态和动画效果。某次从模板工程复制代码到新工程时,引入了两个看似毫无关联的 bug。经过多轮排查,最终发现它们共享同一个根因——JavaScript 中最经典的陷阱之一:var在 for 循环中的闭包问题。
本文记录了完整的排查过程,包括走过的弯路和最终定位的思路,希望对类似场景有参考价值。

TL;DR:AI 生成的代码在 for 循环中用var声明变量,导致 gsap 动画的onComplete回调闭包全部指向循环最后一次迭代的节点。结果是解锁卡片时操作了错误的对象、查看详情后图片消失。根因是var函数作用域 vslet块作用域。修复:var→let+ 项目规则禁止var+ 文档模板全量替换(139 处)。


技术背景

运行环境

可视化搭建编辑器:页面由节点树组成,每个节点有属性(visible/src/style 等)
MNode:节点的响应式数据模型,修改属性会触发 DOM 更新
gsap:用于执行节点动画(操作 DOM 行内 style)
代码通过数据源方法执行,数据变更触发 UI 更新

业务场景

页面有 3 个"卡片",每个卡片有 3 种状态:锁定、可解锁、已解锁。解锁时播放淡入动画(opacity 0→1),解锁后点击可打开详情弹窗。
核心代码结构:
async function updateCards(cardList) {  // card.children 包含不同状态的子节点:背景底图、锁定容器、可解锁图、已解锁图、标题、图标、点击区  for (var index = 0; index < cardList.length; index++) {    var card = cardList[index];    var children = card.children;    var cardImage = getNode(children[3].id);       // 已解锁图片    var iconImage = getNode(children[5].id);       // 图标    if (card.isUnlocked && isPlayingAnimation) {      // 解锁动画      gsap.to('#' + iconImage.id, {        opacity0duration0.4,        onCompletefunction () { iconImage.visible = false; }      });      gsap.to('#' + cardImage.id, {        opacity1duration1.8,        onCompletefunction () {          cardImage.style = Object.assign({}, cardImage.style, { opacity1 });        }      });    }  }}

Bug 现象

Bug 1:解锁卡片后查看详情,卡片图片消失
  1. 卡片从"可解锁"变为"已解锁",淡入动画正常播放
  2. 点击该卡片打开详情弹窗
  3. 关闭弹窗后,卡片图片变为空白(opacity 被重置为 0)
Bug 2:解锁卡片1时,卡片3的图标消失
  1. 三个卡片都处于"可解锁"状态
  2. 点击解锁卡片1
  3. 卡片1正常执行解锁动画
  4. 卡片3的图标突然消失
两个 bug 看似无关:一个是"查看详情后图片消失",一个是"解锁时错误卡片受影响"。

排查过程

第一轮:猜测状态重置

假设:打开/关闭详情弹窗时触发了状态重新渲染,重渲染时读取到了旧的 opacity 值。
验证:打开详情弹窗不会修改卡片数据 → 不会触发 updateCards → 这个假设不成立。
结论:方向错误。问题不在"状态管理"层面。

第二轮:猜测 gsap onComplete 延迟执行

假设:gsap 的 onComplete 回调没有在动画完成时立即执行,导致 MNode.style.opacity 一直停留在 0。后续弹窗操作触发了框架的 DOM 同步(reconciliation),从 MNode 读到 0 并重置了 DOM。
验证:在 onComplete 中写入调试变量window._debug,动画完成后立即检查。
发现
解锁动画结束后(~2秒)→ window._debug = undefined(onComplete 未执行!)打开详情弹窗后 → window._debug 出现了(onComplete 此时才执行)
中间结论:onComplete 确实延迟执行。但它执行时输出 MNode.opacity=1, DOM.opacity=1——为什么最终还是变空白?

事后回顾:此时 onComplete 执行的cardImage.style.opacity = 1设置的是卡片3的 MNode(不是卡片1的)。卡片1的 MNode.style.opacity 从未被修改过,仍是之前在"可解锁"状态下设置的 0。因此排查时陷入了对框架响应式同步(reconciliation)机制的猜测——试图理解"为什么 MNode=1 但 DOM 还是会重置"——但根因其实是 MNode 本身就没被正确更新。

此时排查陷入了对框架 reconciliation 机制的猜测,试图理解"为什么 onComplete 执行后 DOM 还会被重置"。

第三轮:绕过 onComplete 修复

修复尝试:不依赖 onComplete,在 gsap.to 启动前立即设置cardImage.style.opacity = 1。
结果:卡片不再消失了!但解锁动画消失了(因为 MNode 立即设为 1 → 框架同步 DOM 为 1 → gsap 没有 0→1 的变化空间)。
改进:用gsap.fromTo强制从 0 开始动画:
cardImage.style = Object.assign({}, cardImage.style, { opacity: 1 }); // MNode 立即为 1gsap.fromTo('#' + cardImage.id, { opacity: 0 }, { opacity: 1, duration: 1.8 }); // DOM 从 0 渐变
结果:Bug 1 修复了。但根因仍然没有被理解。

第四轮:Bug 2 揭示真相

当用户报告 Bug 2("解锁卡片1时卡片3的图标消失")时,这触发了关键联想——循环闭包问题
"总是最后一个元素被错误操作"——这是var闭包 bug 的经典症状。

根因分析

var 的函数作用域 vs let 的块作用域

// var:整个函数共享同一个变量for (var i = 0; i < 3; i++) {  setTimeout(function() { console.log(i); }, 100);}// 输出:3, 3, 3(都是循环结束后的值)// let:每次迭代创建独立变量for (let i = 0; i < 3; i++) {  setTimeout(function() { console.log(i); }, 100);}// 输出:0, 1, 2(各自迭代时的值)
在本案例中的具体表现
for (var index = 0; index < 3; index++) {  var cardImage = getNode(items[3].id);   // var → 函数作用域  var iconImage = getNode(items[5].id);   // var → 函数作用域  if (shouldAnimate(index)) {    gsap.to('#' + cardImage.id, {         // 选择器字符串 → 立即求值 → 正确      onCompletefunction () {        cardImage.style.opacity = 1;      // 闭包引用 → 延迟求值 → 错误!      }    });    gsap.to('#' + iconImage.id, {      onCompletefunction () {        iconImage.visible = false;        // 闭包引用 → 延迟求值 → 错误!      }    });  }}
关键区分

'#' + cardImage.id:字符串拼接是同步的,在 gsap.to 调用时立即求值 → 得到正确的 ID

onComplete回调中的cardImage:是闭包引用,在回调异步执行时才求值 → 此时cardImage已被循环覆盖为最后一个卡片的节点

Bug 1 因果链

解锁卡片1 (index=0):  → cardImage 指向卡片1 → gsap.to 启动(选择器正确)  → 循环继续 → cardImage 被覆盖为卡片3  → onComplete 执行 → cardImage.style.opacity=1 设置的是卡片3  → 卡片1 的 MNode.style.opacity 从未变为 1(仍是 0  → 打开详情弹窗 → 框架 DOM 同步 → 从卡片1 MNode 读到 opacity=0 → DOM 重置

Bug 2 因果链

解锁卡片1 (index=0):  → iconImage 指向卡片1 → gsap.to 启动(选择器正确)  → 循环继续 → iconImage 被覆盖为卡片3  → onComplete 执行 → iconImage.visible=false 隐藏的是卡片3的图标

两个 bug 共享同一根因

Bug

表现

受影响对象

原因

1

解锁后查看详情图片消失

被解锁的卡片自身

onComplete 设 opacity 到了错误节点

2

解锁卡片1时卡片3图标消失

最后一张卡片

onComplete 设 visible 到了错误节点


为什么模板工程没有这个 bug

对比发现:模板工程的原代码由人类编写,使用const/let(块作用域),每次循环迭代变量独立,闭包不会出错。
但这次复制到新工程的代码是AI 生成的。AI 在生成时参考了两样东西:
  1. 项目规则中有一条约束:"语法兼容 ES2017,不得使用更新的语法特性(如可选链?.、空值合并??等)"——AI 将其过度解读为"应使用更保守的语法"
  2. 文档模板中的代码示例全部使用 var——AI 忠实模仿模板风格
传播链:
项目规则:"不要用新语法特性"(本意是禁止 ES2020+)          ↓ AI 过度解读文档模板:代码示例全用 var(历史习惯,但无 for+异步回调场景,模板本身不出 bug)          ↓ AI 模仿模板风格AI 生成代码:所有变量统一用 var 做机械替换          ↓ "for 循环 + gsap onComplete" 场景触发闭包陷阱 → Bug
关键洞察:let/const是 ES2015 的特性,完全在 ES2017 范围内。模板工程的原代码也使用const/let。但 AI 不理解"for 循环中的 var 有闭包风险",只是机械地遵循"模板用什么我就用什么"。而这正是人类开发者的优势——人类的编码直觉能识别"这个地方用 var 不行"。
这暴露了 AI 辅助开发的一个隐性风险:文档模板的"坏习惯"不会影响人类(人类凭直觉会纠正),但会被 AI 忠实复制和放大。

修复方案

直接修复:var → let

for (let index = 0; index < cardList.length; index++) {  let cardImage = getNode(items[3].id);  let iconImage = getNode(items[5].id);  // 每次迭代的 onComplete 闭包捕获各自独立的变量}

防御性修复:不依赖 onComplete 设 MNode

// 立即设 MNode.style.opacity = 1(防止 reconciliation 重置)cardImage.style = Object.assign({}, cardImage.style, { opacity1 });// 用 fromTo 强制 DOM 从 0 开始动画(保留视觉效果)gsap.fromTo('#' + cardImage.id, { opacity0 }, { opacity1, duration1.8 });
两种修复结合使用(双重保险)。

制度修复:规则 + 模板更新

  1. 在项目编码规范中新增:禁止使用var,统一使用const/let(含原因说明)
  2. 将所有文档模板中的var替换为正确的const/let(3 个文件,共 139 处)
  3. 确保 AI 后续生成代码时参考的模板不再包含var
这是从根源上断绝问题再次产生的措施——当所有文档、模板、规则都统一使用const/let时,无论是人类开发者还是 AI,都不会再写出var。

经验总结

排查中走的弯路

弯路

原因

教训

猜测框架 reconciliation 机制

不熟悉框架内部实现,试图从黑盒行为推导原因

先排除代码层面的基础问题,再考虑框架机制

只看逻辑差异不看语法差异

对比模板代码时关注了结构/算法,忽略了 var/let

对比代码要到语法级别

在单一 bug 上打转

Bug 1 让我陷入 opacity/reconciliation 分析

多个 bug 交叉分析可能更快定位共同根因

识别信号(排查速查表)

如果看到以下任何一条,立即怀疑var闭包问题:
"总是最后一个/第 N 个元素被错误操作"
"回调执行时操作的对象不是预期的"
"循环中的动画/定时器影响了错误的元素"
异步回调(setTimeout/Promise/gsap onComplete/事件监听器)在 for 循环内注册

防御性编程原则

  1. 禁止var:从制度上消除问题产生的可能性
  2. 异步回调中避免依赖循环变量:即使用了let,也尽量在回调外通过字符串/ID 固化引用
  3. MNode 状态应立即更新:不要把关键状态变更放在异步回调中,框架可能在回调执行前就读取了旧值
  4. 模板代码要用最安全的写法:模板风格会被团队复制传播,一个var模板可能产生 N 个闭包 bug

结语

这个 bug 的根因(var 闭包)是 JavaScript 最基础的知识点,任何入门教程都会提到。但在实际工程中,它依然能够:
  1. 伪装成框架行为问题("为什么 reconciliation 重置了我的 DOM?")
  2. 通过多个看似无关的症状分散注意力(Bug 1 和 Bug 2 表现完全不同)
  3. 通过 AI + 文档模板悄悄扩散(文档用 var → AI 学习模板 → 新代码全用 var → bug)
这个案例也揭示了 AI 辅助开发中的一个重要原则:给 AI 的参考文档和模板代码,必须使用最安全的写法。人类开发者能凭直觉规避的"不推荐写法",AI 会忠实模仿。文档中的每一个var、每一个不规范的示例,都可能在 AI 生成的代码中被放大为 bug。
最终我们的应对措施:
  1. 项目规则中明确禁止var(给 AI 和人类同一个约束)
  2. 文档模板全量替换为const/let(消除 AI 的错误学习源)
  3. 复盘记录作为项目知识沉淀(后续 AI 和人类都能参考)
教训:遇到异步回调 + 循环的组合时,第一时间检查变量声明方式,不要跳过基础直接分析框架行为。而对于 AI 辅助开发——确保你的文档模板本身是无懈可击的。
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-12 02:39:09 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/742078.html
  2. 运行时间 : 0.083622s [ 吞吐率:11.96req/s ] 内存消耗:5,030.02kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=43ff720c3cdfa9259edc8d5526304c70
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000537s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000847s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000348s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000290s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000475s ]
  6. SELECT * FROM `set` [ RunTime:0.000204s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000538s ]
  8. SELECT * FROM `article` WHERE `id` = 742078 LIMIT 1 [ RunTime:0.000456s ]
  9. UPDATE `article` SET `lasttime` = 1781203149 WHERE `id` = 742078 [ RunTime:0.000744s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000232s ]
  11. SELECT * FROM `article` WHERE `id` < 742078 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000443s ]
  12. SELECT * FROM `article` WHERE `id` > 742078 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000373s ]
  13. SELECT * FROM `article` WHERE `id` < 742078 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000811s ]
  14. SELECT * FROM `article` WHERE `id` < 742078 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000666s ]
  15. SELECT * FROM `article` WHERE `id` < 742078 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001004s ]
0.085288s