Chrome开发者工具控制台无法显示闭包。

4
我尝试了一个非常基本的Javascript闭包示例,但是我无法在Chrome开发工具中可视化它。请查看截图。
我已经创建了一个全局变量。
var p = 3;

和一个函数

function f1() {
    var q = 2; 
    return p+q;
}

这个函数在内部使用了全局变量p,所以这是一个闭包,对吗?如果我理解有误,请指导我。

那么,如果这是一个闭包,为什么它不在函数作用域中显示为“Closure”呢?

enter image description here


1
从技术上讲,引用全局变量并不构成闭包。闭包是指函数在封闭的函数作用域内关闭一个变量。(你可能会发现有人声称关闭全局变量构成闭包,但实际上并非如此--而你看到的Chrome开发工具显示也反映了这一点。) 更多关于这个主题的信息,请参见https://dev59.com/yVsW5IYBdhLWcg3wTly8#35131645。 - user663031
@torazaburo... 在《JavaScript 权威指南》一书中,David Flanagan 提到:"从技术上讲,所有的 JavaScript 函数都是闭包:它们是对象,并且与之相关联的是一个作用域链。"在这种情况下,它也有关联的作用域链,对吧? - Roy
4
如果你愿意这样看的话,开发工具显示确实显示了闭包;只是在这种情况下它称之为“全局”,因为这是全局作用域。然而,正如我上面链接的问题所讨论的那样,将这种特殊情况称为闭包在某种程度上既不帮助理解也容易引起混淆。这本书所说的并没有错,但关键词是“技术上”。将此情况称为闭包与常见用法不一致,并且与引擎实际实现方式也不一致。 - user663031
@torazaburo...+1 我看到了讨论链接,很有帮助...是的,我同意称这种特殊情况为闭包并没有太多意义... - Roy
请参见此处 - Bergi
1个回答

5
w3schools.com中说:“闭包是指一个函数可以访问其父级作用域,即使在父级函数已关闭后仍然可以访问。” 在您的示例中,p是在全局作用域中定义的,而不是在父级函数中。如果您将代码包装在父级函数中,在开发工具中,您将看到p列在闭包下。
var f2  = function(){

    var p = 3;

    var f1 = function(){
        var q = 2;
        return p + q;
    }

    return f1;

}();

console.dir(f2);

enter image description here


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