为什么Chrome不'不允许在调试中更改变量

Why Chrome don't allow change variables in debug

本文关键字:调试 改变 变量 不允许 Chrome 为什么      更新时间:2023-09-26

我在Chome devtools中运行下一个代码

(function() {
  var a = 5;
  debugger; // when I stop here I evaluate `a = 9`
  console.log(a);
})(); // and got 5

但是如果我使用

(function() {
  var a = { a: 5 };
  debugger; // when I stop here I evaluate `a.a = 9`
  console.log(a.a);
})(); // and got 9

为什么?

PS还有为什么它在FF/Safari中不起作用(它甚至没有在调试器行中停止)

这只是一个bug,将在即将发布的版本中修复。

如果你想要一个比这更深入的"为什么",你需要了解Chrome的调试器和JavaScript实现。根据修复中一个文件的差异,调试器以前使用context_builder.native_context,但现在使用context_builder.evaluation_context。显然,由旧调试器代码创建的native_context在解决(或不将其视为只读)本地作用域变量时遇到了问题。如果您真的想要更多,您可以联系修复程序的作者。

至于为什么调试器没有出现在Firefox中:如果您正在从<script>运行代码并打开开发工具,它就会出现。从控制台运行代码时,似乎必须专门打开调试器选项卡。显然,如果您打开控制台输入代码,这是不可能的,但您可以将其封装在setTimeout中,并快速切换到Debugger选项卡:

setTimeout(function() { debugger; }, 5000)

这是如何使用变量的问题。对象是通过引用使用的。因此,改变a.a将有效地改变适当存储器地址处的值。不过,在任何测试版本中更改a本身都不会有任何作用,因为会为控制台中计算的变量创建一个新的内存地址。

对于FireFox没有在debugger行中断,它在本页中声明(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger):"如果没有调试功能,这句话就没有效果。"。所以,我想你必须确保安装了FireBug。