使用此代码:
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
语句重现这一点。