什么是闭包呢?
在讲闭包之前,先要了解下js的回收机制。在js中,若一个对象不再被引用,那么他将会被 GC 回收,否则将一直保持在内存中。正是因为有这样的回收机制,才形成了能够构成闭包的先决条件。
能够在A函数作用域外,通过某一函数访问A函数域内创建的变量,就组成了闭包。
function fn(){
let a=1;
return function(){
return ++a;
};
}
let fn1=fn();
console.log(fn1()); // 2
console.log(fn1()); // 3
上面例子的 fn1 就是一个闭包。函数fn1可以访问到函数fn内部的a变量。
例子1:自执行函数式的闭包
let obj = (function(){
let a=0;
let fn=function(){
return ++a;
}
return {
fn
};
})();
console.log(obj.fn());//1
console.log(obj.fn());//2
例子2:
function fn(){
let b=0;
return function(){
return ++b;
}
}
let fn3=fn();
let fn4=fn();
console.log(fn3());//1
console.log(fn4());//1
为什么这个例子输出的结果没有像前面例子那样累加呢?闭包中变量b仅与它形成的作用域有关,与函数fn无关,所以fn3和fn4中的 b是两个不相关的变量,故不会累加。
闭包有什么用途呢?
因为闭包本身的特点,闭包可以构造函数私有变量;可以避免全局变量污染;可以让一个变量常驻内存,做缓存。当然,使用闭包,也是有缺点的,就是会增加内存消耗。