什么是闭包?
MDN:闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建;
闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量;
简单来说:就是函数嵌套使用,内部函数需要访问外部函数的变量,若内部函数始终存在于内存中,由于内部函数变量依赖于外部函数的原因,就会使得外部函数的数据不会被垃圾回收机制回收。
闭包的生成有三个必要条件?
1.函数嵌套
2.内部函数引用了外部函数的属性或函数
3.参数和变量不会被回收
待定条件:外部函数return内部函数
创建闭包最常见方式,就是在一个函数内部创建另一个函数:
function f1() {
var n = 999;
nAdd = function () { n += 1 }
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000
f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。