我已经阅读了几十篇有关闭包的stackoverflow参考资料、MDN文档和其他博客文章。他们似乎都根据自己的理解给出了闭包的定义。例如,根据MDN文档:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
以下是对闭包的解释:
通常,函数内部的本地变量仅在该函数执行期间存在。一旦makeFunc()执行完毕,我们可以合理地期望name变量将不再可访问。然而,显然这不是这种情况。
这个谜题的解决办法就是myFunc已经成为一个闭包。闭包是一种特殊的对象,它结合了两个东西:一个函数和创建该函数的环境。该环境由在创建闭包时处于范围内的任何本地变量组成。在这种情况下,myFunc是一个闭包,它包含displayName函数和创建闭包时存在的"Mozilla"字符串。
以下StackOverflow帖子回答了闭包作为可见范围栈的问题。 What types of scope exist in Javascript?
我所困惑的是:闭包是一个对象吗?还是只是“异常作用域情况”,其中内部嵌套函数可以访问定义在其外部但是在父容器函数中局部的变量,甚至在父函数执行后仍然有效?闭包是指向像myFunc
这样的嵌套函数(作用域)的对象,还是指嵌套函数本身?