什么是闭包
在JavaScript中局部作用域可以访问全局作用域的变量,全局作用域不允许访问私有作用域的变量,使用闭包可以让函数外部作用域拿到函数内部作用域的私有变量。
function fn(){
var a = 5;
}
console.log(a); // a is not defined
这里我们可以看到,在函数外部是拿不到函数内部的变量a,因为变量a是私有变量,如果我们需要拿到函数内部的私有变量需要使用闭包。
var fn2 = (function () {
var a = 5;
function fn1() {
return a;
}
return fn1;
})();
console.log(fn2()); //5
首先使用了匿名函数自调用将函数内部的fn1函数作为返回值赋值给了变量fn2,然后在函数外部调用变量fn2就可以拿到函数内部的私有变量。
优点
- 使用闭包可以减少全局污染,命名重复的冲突。
- 还可以延长的函数内部私有变量的生命周期。
- 加强了封装性,对变量达到更有效的保护。
缺点
会让函数内部的变量保持在内存中,这样使内存的消耗大,还有可能会导致内存泄漏。
需要在退出函数之前,将不使用的局部变量全部删除。手动释放闭包内的变量来解决问题。