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

标签 javascript debugging

来自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 函数使用(例如 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

最佳答案

推测这是 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/

相关文章:

javascript - 每当触发鼠标悬停时更改 CSS 填充属性的优雅方法?

javascript - Lodash throttle - 防止函数在延迟后被额外调用

c# - 在 Visual Studio 2010 中运行事件项目

windows - 从 Windows 用户模式转储文件中识别主机

ios - 检测有问题的数组( Debug模式)

计算时出现 Javascript 错误

javascript - 哪个正则表达式匹配两对数字之间的冒号?

javascript - 为什么 JSON.stringify 会忽略值未定义的键?

Ruby 类,我怀疑我做错了实例标记

python - 无法从 VS Code 调试 Django 进程