什么是闭包
首先讲一个小故事:有一个被围起来的森林,森林里面有很多优质的资源,只有在里面的小动物可以享受到这个森林里面的资源,当然里面的小动物也可以享受外面的公共资源。但是外面的动物不能享受到里面的资源。一天森林里选举了一个管理员。从此这个森林有了一个通道,管理员每天在通道站岗,只要外面的动物找到管理员,那就可以享受里面的资源了
闭包就是函数内部和函数外部连接起来的桥梁,一般情况下函数的作用域是一个封闭的小盒子,函数内部可以使用外部的变量或方法,但是外部不能访问内部的变量和方法,函数执行完后,函数的作用域就会被删除。有了闭包后,只要通过闭包就可以访问函数内部的方法和变量,而闭包又相当于函数内的小区域,所以只要闭包不被销毁,函数就不会被销毁。(在JavaScript中,函数调用之后其变量对象本应该被销毁,但闭包阻止了它们的销毁,所以仍然可以访问函数的变量对象)
function addCalculator (x) {
const add=function (y) {
return x + y;
}
return add
}
var add1 = addCalculator(1);
console.log(add1(1)); //2
console.log(add1(3)); //4
add1 = null;// 释放对闭包的引用
上面的addCalculator函数就是一个小森林。而add就是选举的管理员。只要找到add,就可以访问到里面的资源了。这里内部资源就是x。当然森林通道可以有很多。管理员也可以有多个,如下代码
var calculator = (
function(){
var a = 1;
function addCalculator(val){
a += val
}
return {
add1:function() {
addCalculator(1);
},
add2:function() {
addCalculator(2);
},
result:function() {
return a
}
}
})();
console.log(calculator.result()); // 1
calculator.add1();
console.log(calculator.result()); // 2
calculator.add2();
console.log(calculator.result()); // 4
这三个公共函数是共享同一个环境的闭包,它们都可以访问 a变量和 addCalculator函数
闭包的优缺点
优点
- 保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
缺点
-
闭包会使得函数中的变量都被保存在内存中,所以滥用闭包的话会造成性能问题,在IE(IE9)之前可能导致内存泄露。
解决方法:在退出函数之前,将不使用的局部变量全部删除(例如手动赋值为null)
望大家多多指教,多提意见,共同进步