从jQuery文档JavaScript指南中得知:
由于局部作用域是通过函数实现的,因此在另一个函数中定义的任何函数都可以访问外部函数中定义的变量。
由于在“外部”函数中定义的变量可以被“内部”函数(例如x或y)使用,为什么调试器不能调用变量y?
我怀疑人们会回答说调试器只显示在最内/本地范围内定义的变量。这是因为如果在内部函数中使用调试器检查变量时不区分内部和外部作用域,那么就无法进行区分。 此外,每个在内部作用域中执行的定义在外部作用域中的变量允许调试器访问它。
但是,如果是这种情况,难道没有一种方法可以从内部函数中的控制台调用变量y吗?(使用相应作用域的符号表示,例如outer.y)
编辑:其他语言中的调试器
显然,调试器的这种行为不仅限于JavaScript。例如Python调试器pdb也有类似的行为:
由于局部作用域是通过函数实现的,因此在另一个函数中定义的任何函数都可以访问外部函数中定义的变量。
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
由于在“外部”函数中定义的变量可以被“内部”函数(例如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