用这个密码:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
我得到了一个意想不到的结果:
当我更改代码时:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
我得到了预期的结果:
另外,如果在内部函数中有对 eval
的调用,我可以按照自己的意愿访问变量(不管我传递给 eval
的是什么)。
同时,Firefox 开发工具在这两种情况下都提供了预期的行为。
为什么 Chrome 的调试器不如 Firefox 方便?我观察这种行为已经有一段时间了,直到版本41.0.2272.43 beta (64位)。
是不是 Chrome 的 javascript 引擎在可能的情况下“扁平化”了函数?
有趣的是,如果我添加内部函数中 是引用的第二个变量,x
变量仍然没有定义。
我知道在使用交互式调试器时,在范围和变量定义方面经常会出现一些问题,但在我看来,基于语言规范,应该有一个“最佳”的解决方案来解决这些问题。所以我很好奇这是否是因为 Chrome 比 Firefox 优化得更多的缘故。还有这些优化是否可以在开发期间轻松禁用(也许在开发工具打开时应该禁用它们?).
此外,我还可以使用断点和 debugger
语句来重现这一点。