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

时间:2016-04-18 13:17:11

标签: javascript google-chrome debugging

我在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中不起作用(它甚至没有在调试器行中停止)

2 个答案:

答案 0 :(得分:0)

这是行为simply a bug,将在即将发布的版本中修复。

如果你想要" 为什么"更深层次的是,您需要了解Chrome的调试器和JavaScript实现。根据{{​​3}},调试器以前使用的是context_builder.native_context,但现在它使用的是context_builder.evaluation_context。显然,旧调试器代码创建的native_context无法解析(或不处理为只读)局部范围变量。如果真的想要更多,您可以联系修复的作者。

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

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

答案 1 :(得分:-2)

这是变量如何使用的问题。对象通过引用使用。因此,更改a.a将有效地更改适当内存地址的值。但是,在任何测试版本中更改a本身都不会执行任何操作,因为为控制台中评估的变量创建了新的内存地址。

对于FireFox未在debugger行中断,它在此页面中指出(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger):“如果没有可用的调试功能,则此语句无效。”因此,您必须确保安装FireBug。