【问题标题】:Calling variables defined in outer function from inner function with debugger使用调试器从内部函数调用外部函数中定义的变量
【发布时间】: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函数使用(例如xy),为什么调试器不能调用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


【解决方案1】:

大概这是 JavaScript 引擎的优化。由于您没有在内部函数中引用y,因此无需在闭包中保留它。这将允许在外部函数返回时对其进行垃圾回收。

如果您添加对y 的引用(例如console.log(x, y)),您可以按预期看到xy 的值。

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

显然不是。您可以在调试时在inner 中添加对y 的引用(它不需要做任何事情,任何引用都可以)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2013-11-14
    • 2018-06-12
    • 1970-01-01
    • 2014-10-01
    • 2012-04-25
    • 2021-08-20
    相关资源
    最近更新 更多