调试控制台仅在断点暂停时可求值当前栈帧的合法表达式,支持变量访问、属性链、数组方法等,但不支持import/require、多行语句、async/await;修改变量需用setExpression指令,监视表达式可自动更新。

调试控制台不是终端,不能直接跑 import 或定义函数,但它能在断点暂停时,准确求值当前作用域里的任意合法表达式——这是它最核心、最常用的能力。
断点暂停后才能输入表达式
调试控制台的执行上下文严格绑定当前栈帧。没停在断点,或者程序正在运行,你输什么都会报错或无响应。
- 必须先设置断点(比如在某行代码左侧灰边栏点击),再按
F5启动调试 - 等程序真正暂停(代码行高亮、左侧出现黄色箭头)后,再切到调试控制台
- 此时输入
user.name、items.length、response?.data?.items[0]?.id都能立刻出结果 - 如果变量未定义或拼写错误,会显示
ReferenceError或undefined,不是环境问题,而是作用域里真没有
支持哪些表达式?边界在哪
能用,不等于该用;语法通过,不等于行为安全。
- ✅ 支持:变量访问(
count)、属性链(config.settings.theme)、数组方法(list.filter(x => x > 10))、简单计算(a + b * 2)、格式化(JSON.stringify(data, null, 2)) - ❌ 不支持:
import/require、多行语句(换行即执行,不会等你补全if块)、async/await直接调用(会提示coroutine was never awaited) - ⚠️ 谨慎使用:调用有副作用的函数,比如
localStorage.setItem('debug', 'on')或api.updateUser()—— 它真会执行,可能污染后续调试状态
修改变量值要用 setExpression,不是直接赋值
在控制台里敲 count = 999 看似能改,但实际行为不稳定:部分调试器(尤其是 Chrome/Node.js)会接受,但变量面板不刷新,下次断点仍显示旧值;更可靠的方式是用调试器原生指令。
- 推荐写法:
setExpression "count" "999"(注意引号包裹) - 也支持表达式赋值:
setExpression "user.status" "'inactive'"或setExpression "total" "price * quantity" - 修改后需单步(
F10)或继续(F5)一次,变更才会反映到调用栈和变量面板中(Chromium issue #820535) - 别依赖控制台回显的
value: 999就以为改成功了——一定要看“变量”面板或再输一遍count确认
监视表达式比反复输入更省事
如果你要盯一个值变化多次(比如循环里看 i、异步回调里看 result.data),每次暂停都手动输太累。
- 打开“监视”面板(Debug → Watch),点
+,输入表达式,例如:response.status、items.filter(x => x.valid).length - 之后每次断点命中,这些表达式自动求值并更新,不用再切到控制台
- 特别适合监控深层嵌套(
user.profile?.preferences?.theme)或计算逻辑(isReady() && !hasError()) - 如果某次显示
NaN或ReferenceError,说明当前栈帧里那个路径不可达,不是语法错,是作用域切换了
最常被忽略的一点:调试控制台的“当前作用域”会随调用堆栈变化。你在第 3 层函数暂停,this 和局部变量是第 3 层的;切到第 1 层栈帧,控制台上下文立刻变成第 1 层——很多人输不出值,其实是没注意左下角的“调用堆栈”选中的是哪一层。


















