为什么 Chrome 调试器认为封闭的局部变量未定义?
使用此代码:
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