Javascript 使用调试器从内部函数调用外部函数中定义的变量
从: 因为局部作用域通过函数工作,所以定义的任何函数 在另一个函数中,您可以访问外部函数中定义的变量: 既然Javascript 使用调试器从内部函数调用外部函数中定义的变量,javascript,debugging,Javascript,Debugging,从: 因为局部作用域通过函数工作,所以定义的任何函数 在另一个函数中,您可以访问外部函数中定义的变量: 既然外部函数中定义的变量可以由内部函数使用(例如x或y),为什么调试器不能调用y变量 我猜想人们会回答,调试器只显示在最内部/局部范围内定义的变量。原因是,在内部函数中使用调试器检查变量时,使用调试器无法区分内部作用域和外部作用域。 此外,在内部范围中执行的外部范围中定义的每个变量都允许调试器访问它 但是如果是这样的话,是否仍有办法从内部函数的控制台调用变量y?(使用与范围相关的符号,例如ou
外部
函数中定义的变量可以由内部
函数使用(例如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
这可能是JavaScript引擎的优化。由于您没有在内部函数中引用
y
,因此无需在闭包中保留它。这将允许在外部函数返回时对其进行垃圾收集
如果添加对y
(例如console.log(x,y)
)的引用,您可以看到x
和y
的值
在内部函数中,是否仍有一些方法可以从控制台调用变量y
显然不是。调试时,您可以在
internal
中添加对y
的引用(它不需要做任何事情,任何引用都可以)。在sources选项卡中,您可以查看Watch表达式和Scope变量-正如James Allardice的回答所指出的,y永远不会添加到闭包范围中。
> x
5
> y
ReferenceError: y is not defined
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