因为局部作用域通过函数起作用,所以在另一个函数中定义的任何函数都可以访问在外部函数中定义的变量:
function outer() {
var x = 5;
var y = 2;
function inner() {
console.log( x );
debugger; // <-- !!!
}
inner();
}
outer()
控制台触发debugger
:
> x
5
> y
ReferenceError: y is not defined
既然函数中定义的变量outer
可以被inner
函数使用(例如x
或y
),为什么调试器不能调用该y
变量?
我怀疑人们会回答调试器只显示在最内部/本地范围内定义的变量。这样做的原因是,在内部函数中使用调试器检查变量时,使用调试器无法区分内部和外部范围。此外,在内部范围内执行的外部范围中定义的每个变量都允许调试器访问它。
但如果是这样的话,难道没有办法仍然y
从内部函数内部的控制台调用变量吗?(使用尊重范围的符号,例如outer.y
)
编辑:其他语言的调试器
显然,调试器的这种行为不仅限于 javascript。例如,Python 调试器pdb
的行为类似:
def outer():
x = 5
y = 2
def inner():
print x
import pdb; pdb.set_trace()
inner()
outer()
(Pdb) x
5
(Pdb) y
*** NameError: 'y' is not defined