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

Ben*_*ey4 5 javascript debugging

来自jQuery docs javascript指南:

因为局部范围通过函数工作,所以在另一个函数中定义的任何函数都可以访问外部函数中定义的变量

function outer() {
    var x = 5;
    var y = 2;
    function inner() {
        console.log( x );
        debugger; // <-- !!!
    }
    inner();
}
outer()
Run Code Online (Sandbox Code Playgroud)

控制台触发debugger:

> x
5
> y
ReferenceError: y is not defined
Run Code Online (Sandbox Code Playgroud)

由于outer函数中定义的变量可以由inner函数(Eg xy)使用,为什么调试器无法调用y变量?

我怀疑人们会回答调试器只显示在最内部/本地范围内定义的变量.这样做的原因是,当使用内部函数中的调试器检查变量时,使用内部和外部作用域之间的调试器无法区分.此外,在内部作用域中执行的外部作用域中定义的每个变量都允许调试器访问它.

但是如果是这种情况,是不是还有一些方法可以y从内部函数内部的控制台调用变量?(使用符合范围的符号,例如outer.y)

编辑:其他语言的调试器

显然,调试器的这种行为不仅限于javascript.pdb例如,Python调试器的行为类似:

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
Run Code Online (Sandbox Code Playgroud)

Jam*_*ice 5

据推测,这是JavaScript引擎的优化.因为你没有y在内部函数中引用,所以不需要在闭包中保持它.这将允许在外部函数返回时对其进行垃圾回收.

如果您添加一个引用y(例如console.log(x, y)),您可以看到两者的值,x并且y正如您所期望的那样.

是不是还有一些方法可以从内部函数内部的控制台调用变量y?

显然不是.您可以在调试时添加对y内部的引用inner(它不需要执行任何操作,任何引用都可以).