闭包 能够读取其他函数内部变量的函数
例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。简单理解为定义在一个函数内部的函数,内部函数持有外部函数内变量的引用
function fn1(){
var n = 123;
return function fn2(){ //f2是一个闭包
alert(n)
}
}
fn2可以读取fn1中的变量,只要把fn2作为返回值,就可以在fn1外读取fn1内部变量
闭包的用途
- 读取函数内部的变量
- 让这些变量的值始终保持在内存中。不会在fn1调用后被自动清除。
- 避免很多人在开发的时候,大家起的变量名冲突,这时候就将自己的变量放入函数中。
fn1是f2的父函数,fn2被赋给了一个全局变量,fn2始终存在内存中,fn2的存在依赖fn1,因此fn1也始终存在内存中,不会在调用结束后,被垃圾回收机制回收。
优点
- 避免全局变量的污染
- 能够读取函数内部的变量
- 可以在内存中维护一个变量
缺点
- 闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除
使用场景
- 给对象设置私有变量并且利用特权方法去访问私有属性
function Fun(){
var name = 'yr';
this.getName = function (){
return name;
}
}
var fun = new Fun();
console.log(fun.name);//输出undefined,在外部无法直接访问name
console.log(fun.getName());//可以通过特定方法去访问
- 节流防抖用到的闭包(参考)
https://blog.csdn.net/lanseguhui/article/details/117747929?spm=1001.2014.3001.5501