使用此代码:
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
语句来重现此内容。
debugger;
实际上不是从内部调用该行bar
。因此,在调试器中暂停时查看堆栈跟踪:在堆栈跟踪中是否bar
提到了该函数?如果我是正确的,那么堆栈跟踪应该说这是停在5号线,在第7行,在第九行
temp1
将附加到控制台,您可以使用它来访问作用域条目。