来自jQuery docs javascript guide :
Because local scope works through functions, any functions defined within another have access to variables defined in the outer function:
function outer() {
var x = 5;
var y = 2;
function inner() {
console.log( x );
debugger; // <-- !!!
}
inner();
}
outer()
使用调试器
触发的控制台:
> 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
最佳答案
推测这是 JavaScript 引擎的优化。由于您没有在内部函数中引用 y
,因此无需在闭包中保留它。这将允许它在外部函数返回时被垃圾回收。
如果添加对 y
的引用(例如 console.log(x, y)
),您可以看到 x
的值> 和 y
正如您所期望的那样。
isn't there some way to still call the variable y from the console inside the inner function?
显然不是。您可以在调试时在 inner
中添加对 y
的引用(它不必执行任何操作,任何引用都可以)。
关于javascript - 使用调试器从内部函数调用外部函数中定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19637669/