一、 闭包的定义
能访问其他函数内变量的函数,这种结构就是闭包
二、闭包的用途
1.读取函数内部的变量
2.让这些变量的值始终保持在内存中(结果缓存)
3.创建匿名自执行函数(避免全局变量的污染)
三、闭包的弊端
1.使用不当会很容易造成内存泄露
2.常驻内存,增加内存使用量
四、实际应用
接下来举一些实际工作中用到的闭包示例
1.自定义Alert弹框,该弹框只会被new一次,用的就是闭包
module.alert = (function(){
var box;
return function(text){
box = box || new Alert();
box.append('body', text);
return box.show();
}
})();
2.私有化变量
var counter = (function(){
//私有变量
var privateCounter = 0;
return {
increment:function(){
privateCounter++;
},
decrement:function(){
privateCounter--;
},
getValue:function(){
return privateCounter;
}
};
})();
console.log(counter.getValue()); //0
counter.increment();
console.log(counter.getValue()); //1
counter.decrement();
console.log(counter.getValue()); //0
3.利用闭包判断类型
const isType = type => target => `[object ${type}]` === Object.prototype.toString.call(target);
const isArray = isType('Array');
console.log(isArray([])); //true
console.log(isArray({})); //false
4.斐波那契数列求和
//n为数列项数,从1开始
//如 1 1 2 3 5 8 13 21 该斐波那契数列的n为8
let fibonacci = function(n){
if(n < 1) throw new Error('参数有误');
if(n === 1 || n === 2) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
//定义一个闭包函数,将每次求和的结果记录在obj上
const memory = function(fn){
const obj = {};
return function(n){
//如果obj上没有n项数列的结果,就调用上面定义的方法计算,然后将结果保存在obj上;
if(obj[n] === undefined) obj[n] = fn(n);
return obj[n];
}
}
//此处重新用闭包后返回的方法替换上面定义的fibonacci方法,可以将n及之前每一项的结果都缓存在obj上,第一次计算会多耗一些时间,但是下次计算如果n之前已经计算过,便可以直接取结果
fibonacci = memory(fibonacci);
fibonacci(6) //8
fibonacci(8) //21
fibonacci(10) //55