VSCode悬停表达式不自动求值是因为未启用调试会话及debug.evalOnHover配置。需先F5启动调试并命中断点,再在设置中开启debug.evalOnHover:true,且表达式须在当前栈帧作用域内、无副作用、同步可执行。

VSCode 悬停时表达式不自动求值,是因为没开调试会话
悬停求值(Evaluate on Hover)不是编辑器默认功能,它依赖当前处于活跃的调试会话。没有启动调试器,hover 只能显示类型、定义或 JSDoc 注释,不会执行代码。
常见错误现象:const x = 1 + 2; 悬停 x 显示 number,但看不到 3;或者悬停 arr.length 显示 number 而非具体数值。
- 必须先按
F5启动调试(例如用 Node.js、Python 或 Chrome 调试器) - 断点需已命中,或程序处于暂停状态(如断点中断、
debugger语句处) - JavaScript/TypeScript 项目需有有效的
launch.json配置,且"console": "integratedTerminal"或"internalConsoleOptions": "neverOpen"等设置不影响变量上下文
启用 debug.evalOnHover 配置项才能真正开启悬停求值
即使在调试中,默认也可能关闭该功能——VSCode 1.84+ 版本起,debug.evalOnHover 默认为 false,必须手动打开。
操作路径:设置 → 搜索 debug.evalOnHover → 勾选;或直接在 settings.json 中添加:
{
"debug.evalOnHover": true
}
注意:debug.evalOnHover 是全局开关,对所有调试器生效;但实际是否能求值,还取决于调试器本身支持程度(如 Python 的 ptvsd 旧版不支持,需用 debugpy)。
- 某些调试器(如 Go 的
dlv)可能仅支持简单字面量,复杂调用(如func().toString())会报Cannot evaluate expression - 求值过程会真实执行表达式副作用(比如
i++悬停一次,i就加 1),调试时务必留意 - 若悬停后出现
Expression produces a runtime error,大概率是作用域不可达(比如变量已被 GC、或不在当前栈帧)
悬停求值失败?检查调试器是否支持、表达式是否在作用域内
不是所有表达式都能被求值,调试器能力差异很大。Node.js(via node-debug2 或新版 js-debug)支持较好;而 C#、Rust 的官方调试器目前对复杂表达式支持有限。
典型限制场景:
-
this.foo():若this为空或方法未定义,直接报错 -
process.env.MY_VAR:环境变量在调试会话启动前已冻结,修改后悬停仍显示旧值 -
document.querySelector('button'):浏览器调试中可用,但服务端 Node 环境无document,会提示ReferenceError - 异步表达式如
await fetch('/api')不被支持——悬停求值只做同步执行
验证方式:在调试控制台(Debug Console)里手动输入同一表达式,如果那里也报错,悬停必然失败。
替代方案:用 Debug Console 或 Watch 面板更可靠
悬停求值方便但不稳定,尤其涉及对象嵌套、getter、或跨模块引用时容易失效。生产级调试建议优先使用:
-
Watch 面板:右键变量 →
Add to Watch,可稳定观察值变化,支持展开对象、触发 getter -
Debug Console:支持多行、带历史记录,还能调用函数、修改变量(如
obj.x = 99) -
内联值提示(Inline Values):启用
debug.inlineValues后,在代码行末直接显示变量当前值,比悬停更直观,且不依赖鼠标定位
真正难搞的是闭包内被优化掉的变量,或 TypeScript 编译后丢失的源码映射——这时候再怎么调悬停配置也没用,得回头检查 sourcemap 和 devtool 配置。


















