1. 什么是闭包
闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。(闭包可比作背包,背包里放着变量)
function outer(){
var a = '1';
var inner = function(){
cosole.log(a)
}
retrun inner //inner就是一个闭包函数,因为它能够访问到outer函数的作用域
}
2. 为什么要用闭包
在JavaScript(特指ECMAScript5前的版本)语言中具有作用域的仅有函数function。并且有个特点就是:函数内部可以直接访问外部变量,但在函数外部无法访问函数内部变量。
简单说,我们使用闭包的主要作用就是间接访问函数的内部数据。
3. 使用闭包的好处
可以重复使用变量,并且不会造成变量污染,可以用来定义私有属性和私有方法。
4.使用闭包的缺点
比普通函数更占用内存,会导致网页性能变差,在IE下容易造成内存泄露(解决方法是,在退出函数之前,将不使用的局部变量全部删除。)。
5.造成内存泄漏的原因
- 意外的全局变量(在函数内部没有使用var进行声明的变量)
- 闭包
- 对象的循环引用
- 未清除的计时器
- DOM泄露(获取到DOM节点之后,将DOM节点删除,但是没有手动释放变量,拿对应的DOM节点在变量中还可以访问到,就会造成泄露)
6. 闭包的使用场景
封装功能时(需要使用私有的属性和方法),函数防抖、函数节流、函数柯里化、给元素伪数组添加事件需要使用元素的索引值。