闭包定义:
- 《JavaScript高级程序设计》给出的定义是:闭包是指有权访问另一个函数作用域中的变量的函数
- 《Javascript权威指南》给出的定义是:函数对象可以通过作用域关联起来,函数体内的变量都可以保存在函数作用域的内部,所有的JavaScript函数都是闭包。
闭包特点:
- 函数嵌套函数
- 内部函数可以访问外部函数的变量
- 参数和变量不会被回收
举个?
function test(){
let a=1;
return function(){
console.log(a)
}
}
let try=test();
try(); // 1
上述例子,当test()
函数执行后,变量a所占用的内存不会释放,以达到内部嵌套的匿名函数可以使用的目的。
闭包作用:
- 保护变量,实现私有属性和方法
var Counter = (function() {
//私有属性
var privateCounter = 0;
//私有方法
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();
console.log(privateCounter); //privateCounter is not defined
console.log(Counter.value()); // 0
Counter.increment();
Counter.increment();
console.log(Counter.value()); // 2
Counter.decrement();
console.log(Counter.value()); // 1
- 将处理结果储存
var mult = (function(){
var cache = {};
var calculate = function(){
var a = 1;
for(vari=0,l=arguments.length;i<l;i++){
a = a*arguments[i];
}
return a;
};
return function(){
var args = Array.prototype.join.call(arguments,',');
if(args in cache){
return cache[args];
}
return cache[args] = calculate.apply(null,arguments);
}
})();
闭包缺点
-
闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多,所以在使用完后需要将保存在内存中的活动对象解除引用;
-
闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;
-
当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。