从内部函数使用调试器调用外部函数定义的变量

5
jQuery文档JavaScript指南中得知:
由于局部作用域是通过函数实现的,因此在另一个函数中定义的任何函数都可以访问外部函数中定义的变量。
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

1
在源代码选项卡中,您可以检查观察表达式和作用域变量 - 正如James Allardice所指出的答案,y从未添加到闭包作用域中。 - Sacho
1个回答

5
显然,这是JavaScript引擎的一种优化。由于您在内部函数中没有引用y,因此没有必要在闭包中保留它。这将在外部函数返回时允许进行垃圾回收。
如果您添加对y的引用(例如console.log(x, y)),则可以按预期查看xy的值。

难道没有办法从内部函数中的控制台调用变量y吗?

显然不行。在调试期间,您可以在inner中添加对y的引用(它不需要执行任何操作,任何引用都可以)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接