在下面的代码中,当在断点处暂停时,Chrome开发工具会告诉我“foo”是否已定义,具体取决于是否注释掉console.log行。
一旦在断点处,如果在控制台中键入“foo”,或将其添加为监视变量,如果控制台语句被注释掉,则表示foo未定义,但是如果未注释掉控制台语句,那么它将正确显示foo(1)的值。 为什么会这样?
function func1(){
let foo = 1;
var func2 = function (){
function func3 (){
let foo2 = 4;
// put breakpoint here
let foo3 = 5;
// console.log(foo); //says foo is undefined when this line commented
}
func3();
}
func2();
}
func1();
答案 0 :(得分:2)
chrome调试器对于捕获变量很细微。
由于你的内部func3
没有引用foo,然后在调试器中,你无法控制日志 - 即使你写了真正的代码,它会工作的。
试试这个:
function func1(){
let foo = 1;
var func2 = function (){
function func3 (){
let foo2 = 4;
foo; // Note that I'm just referencing the variable, not doing anything with it
// put breakpoint here
let foo3 = 5;
// console.log(foo); //says foo is undefined when this line commented
}
func3();
}
func2();
}
func1();
只需将foo;
添加到内部函数,现在调试器就可以使用它了。