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

既然函数中定义的变量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
4

1 回答 1

5

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

如果您添加对y(例如console.log(x, y))的引用,您可以看到两者的值,xy您所料。

是否有某种方法仍然可以从内部函数内部的控制台调用变量 y ?

显然不是。您可以在调试时添加对 inside 的引用yinner它不必做任何事情,任何引用都可以)。

于 2013-10-28T14:47:39.553 回答