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