什么是闭包
- 在《你不知道的JavaScript》中是这样描述的:
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。闭包是一种现象,不用为了利用闭包而特意创建,因为在代码中随处可见。
-
函数嵌套函数
-
内部函数使用外部函数的参数和变量
-
参数和变量不会被当垃圾回收机制回收
-
栗子
function fn1() {
var name = 'iceman';
function fn2() {
console.log(name);
}
fn2();
}
fn1();
上面的代码已经产生了闭包,fn2访问到了fn1的变量
- fn2的词法作用域能访问fn1的作用域
- 将fn2当做一个值返回
- fn1执行后,将fn2的引用赋值给fn3
- 执行fn3,输出了变量name
闭包的好处
- 你希望有一个变量长期保存内存中
- 避免全局变量污染
闭包的缺点
- 常驻内存,增加内存的使用量
- 使用不当造成内存的泄露