为什么Chrome调试器认为已关闭的局部变量是未定义的?
- 论坛
- 为什么Chrome调试器认为已关闭的局部变量是未定义的?
11 浏览
为什么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
语句来重现这个问题。