断点未生效是因为VSCode默认不自动中断,需设置stopOnEntry或确保断点为实心红点、launch.json中type匹配运行时、sourceMap正确配置;变量显示为空是因作用域限制,悬停查看或调试控制台求值更可靠。

为什么断点没生效,程序直接跑完了?
VSCode 的 Debug 模式默认不自动中断,除非你明确设置了断点或启用了“停在入口”选项。常见原因是:launch.json 中缺少 stopOnEntry 或断点打在了未执行的代码路径上(比如条件不满足的 if 分支里)。
- 确认断点是实心红点——空心表示未绑定(常见于源码与生成代码不匹配、未加载 sourcemap、文件未被调试器识别)
- 检查
launch.json的type字段是否匹配运行时,例如 Node.js 项目必须是"type": "node",Python 项目必须是"type": "python" - 如果用的是 TypeScript 或打包后的代码,确保
sourceMap为true,且outFiles或webRoot路径配置正确
变量值显示为空或 undefined 怎么办?
这不是代码问题,而是调试器作用域或求值时机导致的。VSCode 的“变量”面板只显示当前栈帧可见的局部变量;闭包变量、异步回调中的变量、或尚未声明的 let/const 变量可能不会立刻出现。
- 把鼠标悬停在变量名上,能直接看到实时值——比“变量”面板更可靠,尤其对临时表达式或对象深层属性
- 在“调试控制台”中手动输入
typeof myVar或myVar?.toString(),可绕过作用域限制强行求值 - 注意
const变量在初始化前访问会报ReferenceError,但调试器有时仍显示undefined,属正常行为
如何快速查看对象深层结构而不展开十层?
直接展开嵌套对象容易迷失,而且某些 getter 或循环引用会卡住调试器。VSCode 提供了更可控的方式:
- 右键变量 → “复制值”,粘贴到调试控制台再用
JSON.stringify(obj, null, 2)格式化(注意:不能用于函数、DOM 节点、Date 等非序列化类型) - 在“监视”面板中添加表达式,例如
user.profile?.address?.city或Object.keys(data),只关注你需要的部分 - 对大型数组,用
arr.slice(0, 5)查看前几项,避免一次性展开全部
为什么修改变量值后逻辑没变?
VSCode 调试器允许在断点处修改变量,但仅影响后续执行——已执行过的语句不会回滚,异步任务中修改也未必同步反映到回调里。
- 修改
let变量有效;const变量无法重赋值,尝试会提示Assignment to constant variable - 修改对象属性(如
obj.name = "new")生效,但替换整个对象(obj = {…})只改局部引用,不影响外部持有者 - 修改数组长度(
arr.length = 0)或 push 元素会真实生效;但arr = []属于重新赋值,同const场景
真正难察觉的是异步上下文:你在 Promise resolve 前改了变量,但回调里读的仍是旧快照——这时候得靠断点位置和调用栈来定位实际读取点。


















