为什么Chrome调试器认为已关闭的局部变量是未定义的?

11 浏览
0 Comments

为什么Chrome调试器认为已关闭的局部变量是未定义的?

通过以下代码:

function baz() {
  var x = "foo";
  function bar() {
    debugger;
  };
  bar();
}
baz();

我得到了这个意外的结果:

enter image description here

当我修改代码为:

function baz() {
  var x = "foo";
  function bar() {
    x;
    debugger;
  };
  bar();
}

我得到了预期的结果:

enter image description here

另外,如果在内部函数中有对eval的调用,我可以按照我的意愿访问我的变量(不管我传递给eval的是什么)。

与此同时,Firefox的开发工具在两种情况下都给出了预期的行为。

为什么Chrome的调试器的行为比Firefox的不方便?我已经观察到这种行为已经有一段时间了,包括版本41.0.2272.43 beta(64位)。

是不是Chrome的JavaScript引擎在可以的情况下对函数进行了"扁平化"处理?

有趣的是,如果我添加一个在内部函数中被引用的第二个变量,x变量仍然是未定义的。

我知道在使用交互式调试器时,作用域和变量定义经常会出现一些怪异的问题,但根据语言规范,我认为应该有一个"最佳"解决方案来解决这些问题。所以我非常好奇这是否是由于Chrome进行了比Firefox更进一步的优化。还有这些优化在开发过程中是否可以轻松地被禁用(也许在开发工具打开时应该禁用它们)。

此外,我可以通过断点和debugger语句来重现这个问题。

0