【发布时间】:2015-02-07 23:04:44
【问题描述】:
使用此代码:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
我得到了这个意想不到的结果:
当我更改代码时:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
我得到了预期的结果:
另外,如果在内部函数中有任何对eval 的调用,我可以随意访问我的变量(无论我传递给eval 的内容是什么)。
同时,Firefox 开发工具在这两种情况下都提供了预期的行为。
调试器不如 Firefox 方便的 Chrome 是怎么回事?我已经观察到这种行为一段时间了,直到并包括版本 41.0.2272.43 beta(64 位)。
是不是 Chrome 的 javascript 引擎会尽可能“扁平化”这些功能?
有趣的是,如果我在内部函数中添加 引用的第二个变量,x 变量仍然未定义。
我知道在使用交互式调试器时经常会出现范围和变量定义的怪癖,但在我看来,根据语言规范,应该有一个“最佳”解决方案来解决这些怪癖。所以我很好奇这是否是由于 Chrome 比 Firefox 优化得更远。还有这些优化是否可以在开发过程中轻松禁用(也许应该在开发工具打开时禁用它们?)。
另外,我可以使用断点以及debugger 语句来重现这一点。
【问题讨论】:
-
也许它正在为您排除未使用的变量...
-
markle976 似乎在说
debugger;行实际上并没有从bar内部调用。因此,在调试器中暂停时查看堆栈跟踪:堆栈跟踪中是否提到了bar函数?如果我是对的,那么堆栈跟踪应该说它在第 5 行、第 7 行、第 9 行暂停。 -
我认为这与 V8 扁平化功能无关。我认为这只是一个怪癖。我不知道我是否会称它为错误。我认为大卫下面的回答最有意义。
-
我有同样的问题,我讨厌它。但是当我需要在控制台中访问闭包条目时,我会转到可以看到范围的位置,找到 Closure 条目并打开它。然后右键单击您需要的元素并单击存储为全局变量。控制台附加了一个新的全局变量
temp1,您可以使用它来访问范围条目。
标签: javascript google-chrome google-chrome-devtools