悬停仅支持静态可推导且无副作用的简单表达式,如user?.name、response.status;含函数调用、await、赋值或空属性访问的表达式将不显示或返回undefined。

不能直接在悬浮窗里求值任意表达式——它只显示当前作用域内已声明变量或简单属性访问的值,且不支持函数调用、副作用或跨作用域引用。
为什么悬停显示 undefined 或没反应
常见现象包括:把光标移到 user.profile.name 上,却显示 undefined;或者悬停 getData() 时根本不出提示;又或者在循环体外悬停块级变量 temp,提示框空白。
- 当前堆栈帧中该标识符未声明(如
let temp = 1在for内,你在外面悬停) - 表达式含函数调用(
formatDate(now))、await、赋值或console.log等副作用,调试器主动跳过求值 - 访问了
null或undefined的属性(user.profile.age中user.profile为null),JavaScript 调试器会中断而非返回undefined - 类型信息缺失或 source map 未正确生成(尤其 TypeScript 编译后),导致语言服务器无法解析变量结构
哪些表达式能被悬停安全显示
只有满足“静态可推导 + 无执行风险”的简单路径才进悬浮窗。优先用可选链和基础访问语法:
-
user?.name、items?.[0]?.id—— 避免因中间项为空导致整个悬停失败 -
response.status、config.timeout—— 单层属性访问最稳 -
typeof data、Array.isArray(list)—— 类型检查类表达式多数支持 - 不要写
data.users.map(...)、await fetch(...)、obj.setValue(1),这些一律不出悬浮结果
想看复杂表达式?换地方,别硬靠悬停
悬停是快捷预览,不是求值沙盒。真要验证逻辑或探查深层结构,立刻切到更合适的工具:
- 右键变量名 → “添加到监视”,让
user?.posts?.filter(p => p.active).length在每次暂停时自动刷新 - 调试暂停后,打开 Debug Console,粘贴并回车执行
JSON.stringify(largeObj, null, 2)或db.find({ status: 'pending' }) - 在 Watch 面板里先试
items.length,再逐步扩展成items.slice(0, 3).map(i => i.title),每次加一步确认是否仍可求值 - 对 Python 代码,悬停
data.get('users', [])比data['users']更可能出值,后者遇到 KeyError 就静默失败
悬停的边界很清晰:它不运行代码,只映射当前作用域符号表 + 做极轻量的属性展开。一旦涉及计算、异步、副作用或跨作用域,就得交给 Watch 或 Debug Console —— 不是功能缺陷,而是设计使然。











