我已经阅读了 10 篇关于闭包的 SO 参考资料、MDN 参考资料和其他博客文章。他们似乎都以自己的方式定义了闭包。例如,来自 MDN 文档:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
这是他们对关闭的解释:
通常,函数中的局部变量仅在该函数执行期间存在。一旦 makeFunc() 完成执行,可以合理地预期 name 变量将不再可访问。由于代码仍然按预期工作,显然情况并非如此。
这个难题的解决方案是 myFunc 已经变成了一个闭包。闭包是一种特殊的对象,它结合了两件事:一个函数,以及创建该函数的环境。环境由创建闭包时在范围内的任何局部变量组成。在这种情况下,myFunc 是一个闭包,它包含了 displayName 函数和创建闭包时存在的“Mozilla”字符串。
下面的 StackOverflow 帖子将闭包回答为一堆可见范围。 Javascript 中存在哪些类型的范围?
我感到困惑的地方:闭包是一个对象吗?或者它只是一个“异常范围情况”,其中内部嵌套函数可以访问在其外部定义但对容器父函数本地的变量,即使在父函数已经执行之后?闭包是引用这种嵌套函数(范围)情况的对象myFunc
还是内部函数本身?