【发布时间】:2013-10-28 14:39:17
【问题描述】:
来自jQuery docs javascript guide:
因为本地作用域通过函数起作用,所以定义的任何函数 在另一个内部可以访问外部函数中定义的变量:
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
【问题讨论】:
-
在源选项卡中,您可以检查观察表达式和范围变量 - 正如 James Allardice 给出的答案所指出的那样,y 永远不会添加到闭包范围中。
标签: javascript debugging