闭包定义
一个作用域可以访问另外一个函数内部的局部变量,或者说一个函数(子函数)访问另一个函数(父函数)中的变量。此时就会有闭包产生,那么这个变量所在的函数我们就称之为闭包函数。
function fn() {
let a = 10
return function () {
console.log(a)
}
}
let fn2 = fn()
fn2() // 10
优点
- 闭包的主要作用:延伸了变量的作用范围,因为
闭包函数中的局部变量不会等着闭包函数执行完就销毁,因为还有别的函数要调用它,只有等所有的函数都调用完了他才会销毁。
缺点
- 闭包会造成内存泄漏
- 解决方法:手动释放(手动释放内存,其实就是解除占用,手动赋值为null即可。)
什么是内存泄漏
内存泄漏是指:内存泄漏也称作“存储渗漏”,用动态的存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据内存单元。直到程序结束。(其实就是内存空间使用完毕后未回收)即所谓的内存泄漏。
详解
- 闭包不仅仅可以实现函数内部的作用域访问这个函数的局部变量,还可以实现全局作用域或者是别的地方的作用域也可以访问到函数内部的局部变量,实现方法就是
return了一个函数。 - 所以
return函数也是我们实现闭包的一个主要原理,因为返回的这个函数本身就是我们fn函数内部的一个子元素,所以子函数是可以访问父函数里面的局部变量的,所以返回完毕之后,外面的函数一调用,就会回头调用返回的这个函数,所以就可以拿到这个子函数对应的父函数里面的局部变量。
注意
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部改变父函数内部的值。所以,如果你把父组件当做对象使用,把闭包当做它的公共方法,把内部变量当做它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。