【问题标题】:Why Chrome don't allow change variables in debug为什么 Chrome 不允许在调试中更改变量
【发布时间】:2016-08-10 06:12:30
【问题描述】:

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

【问题讨论】:

  • 在运行第二个示例时,我在控制台中有 5 个 loggen
  • 这似乎是问题bugs.chromium.org/p/chromium/issues/detail?id=124206 已在版本 35 中修复,但在版本 49 中回归(我假设您正在使用),并将在版本 52 中修复。
  • 在 firefox 中,只有在调试器处于活动状态时才会停止,否则不会停止。
  • @the debugger; 在与 Chrome 相同的标准下(即开发工具已打开),在 FF 中对我来说似乎可以正常工作。如果在 FF 中打开开发工具,脚本会在 jsfiddle.net/t1mztbup/2 处暂停吗?

标签: javascript google-chrome debugging


【解决方案1】:

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

如果您想要更深入地了解“为什么”,您需要了解很多关于 Chrome 的调试器和 JavaScript 实现的知识。根据the diff of one file in the fix,调试器以前使用context_builder.native_context,但现在它使用context_builder.evaluation_context。显然,由旧调试器代码创建的native_context 无法解析(或不视为只读)局部范围变量。如果您真的想要更多,可以联系修复的作者。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对谁投了反对票:stackoverflow.com/questions/639514/… 看看@user2310967 的回答
    • 正如apokryfos's comment 所指出的,这种行为in Chrome is simply a bug。此处对 Chrome 行为的任何解释,如果没有注明“此行为是一个错误,不应像当前那样表现出来”之类的内容,都是不完整的。
    • 不用firebug也可以在ff中调试js。
    • The link you provided 不相关,因为控制台代码在 debugger 语句的当前范围内运行。没有理由不能为局部范围变量 a 赋予新值。如果将debugger 语句等效替换为a=9,则代码会按预期输出9
    • OP 要求它为什么这样做,而不是一个错误与否。它是否是错误的决定取决于谷歌打算做什么。此外,它解释了在这里,他们可以通过使用变量作为引用而不是值来纠正它。
    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2016-10-09
    相关资源
    最近更新 更多