Javascript Chrome devtools控制台不显示关闭
我尝试了一个非常基本的Javascript闭包示例,但我无法在Chrome开发工具中可视化它。请看截图 我已经创建了一个全局变量Javascript Chrome devtools控制台不显示关闭,javascript,closures,Javascript,Closures,我尝试了一个非常基本的Javascript闭包示例,但我无法在Chrome开发工具中可视化它。请看截图 我已经创建了一个全局变量 var p = 3; 和一个函数 function f1() { var q = 2; return p+q; } 这个函数在里面使用全局变量p,所以这是一个闭包,对吗?如果我的理解不正确,请指导我 那么,如果这是一个闭包,为什么不在函数范围中显示为“闭包” “闭包是一个可以访问父作用域的函数,即使在父函数关闭之后也是如此。”在您的示例中,p是在
var p = 3;
和一个函数
function f1() {
var q = 2;
return p+q;
}
这个函数在里面使用全局变量p
,所以这是一个闭包,对吗?如果我的理解不正确,请指导我
那么,如果这是一个闭包,为什么不在函数范围中显示为“闭包”
“闭包是一个可以访问父作用域的函数,即使在父函数关闭之后也是如此。”在您的示例中,p是在全局作用域中定义的,而不是在父函数中定义的。如果将代码包装在父函数中,在开发工具中,您将看到闭包下列出的p
var f2 = function(){
var p = 3;
var f1 = function(){
var q = 2;
return p + q;
}
return f1;
}();
console.dir(f2);
从技术上讲,引用全局变量并不构成闭包。闭包是指函数在封闭函数作用域中关闭变量。(您可能会发现有人声称对全局变量的闭包构成闭包,但事实并非如此——您看到的Chrome devtools显示反映了这一点。)有关此主题的更多信息,请参阅。@torazaburo。。。在David Flanagan的《JavaScript-权威指南》一书中提到,“从技术上讲,所有JavaScript函数都是闭包:它们都是对象,并且有一个与之相关联的作用域链。”。。。在这种情况下,它也有关联的作用域链,对吗?如果您愿意这样看,devtools显示的是闭包;在这种情况下,它恰好称之为“全局”,因为它是全局范围。然而,正如我上面提到的问题所讨论的那样,将这个特殊的案例称为结案是无益的,也是令人困惑的。书中所说的狭义上并没有错,但关键词是“技术上”。将这种情况称为闭包与这个词的常用方式不一致,也与引擎实际实现它的方式不一致。@torazaburo…+1我看到了讨论链接,它很有用。。。是的,我同意将这一特殊情况称为结案没有多大意义……另请参见