简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。
MDN 上面这么说:闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。
闭包的生成有三个必要条件
-
函数嵌套函数
-
内部函数引用了外部函数中的数据(属性、函数)
-
参数和变量不会被回收
这样就形成了一个不会销毁的函数空间
-
产生一个闭包
创建闭包最常见方式,就是在一个函数内部创建另一个函数。
先说一个例子,再说说个人理解:
function a() {
var n = 999;
function b() {
console.log(n);
}
return b;
}
var result = a();
result(); // 输出999
result(); // 输出1000
a是b的父函数,而b被赋给了一个全局变量,这导致b始终在内存中,而b的存在依赖于a,因此a也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
因此执行第二次result()函数时,n没有被回收,任然保存在内存中。