来自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
),为什么调试器无法调用{ {1}}变量?
我怀疑人们会回答调试器只显示在最内部/本地范围内定义的变量。这样做的原因是,当使用内部函数中的调试器检查变量时,使用内部和外部作用域之间的调试器无法区分。 此外,在内部作用域中执行的外部作用域中定义的每个变量都允许调试器访问它。
但如果是这种情况,是不是还有某种方法可以从内部函数内的控制台调用变量y
? (使用符合范围的符号,例如y
)
显然,调试器的这种行为不仅限于javascript。例如,Python调试器outer.y
的行为类似:
pdb
答案 0 :(得分:5)
据推测,这是JavaScript引擎的优化。由于您没有在内部函数中引用y
,因此无需在闭包中保留它。这将允许在外部函数返回时对其进行垃圾回收。
如果您添加对y
的引用(例如console.log(x, y)
),则可以按预期看到x
和y
的值。
是不是还有某种方法可以从内部函数内的控制台调用变量y?
显然不是。您可以在调试时在y
内添加对inner
的引用(它不需要执行任何操作,任何引用都可以)。