为什么会有闭包:
1、全局作用域变量都是可以随意访问的这就造成了一个问题,两个开发者设置了相同的变量名根据代码顺序后面的变量名会把前面的变量名给覆盖导致出现问题,闭包就此应运而生
2、受JavaScript链式作用域结构的影响,父级变量中无法访问到子级的变量值,为了解决这个问题,才使用闭包这个概念;
闭包的定义:闭包的原理是当一个函数内部定义了另一个函数,并且这个内部函数引用了外部函数的变量时,就形成了闭包。闭包通过保留对外部函数作用域的引用,使得内部函数能够访问和操作外部函数的变量,即使外部函数已经执行完毕
闭包作用:闭包会成为一个私有变量无法进行更改,全局作用域就无法进行覆盖或者修改,全局作用域也可以访问到函数作用域的变量
闭包代码:
var aaa = 'aaa'
function fn1(param) {
var aaa = '56555'
// 闭包
function fn2() {
console.log(aaa);
}
return fn2
}
fn1()()
闭包的用处:
创建私有作用域,
闭包可以在函数外部访问到函数内部作用域的变量
闭包可以让访问变量不会被垃圾机制回收
闭包的缺点:由于垃圾回收不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出
解决闭包造成的问题:
手动释放闭包 显式地将闭包引用的变量设置为null,这样可以打破对外部变量的引用,使得垃圾回收机制可以回收相应的内存空间。在适当的时机,手动释放不再使用的闭包
避免循环引用: 当闭包内部引用了外部对象并且该外部对象也引用了闭包,形成了循环引用的情况下,垃圾回收机制无法回收相关内存。要解决这个问题,可以尽量避免在闭包内部引用外部对象。如果确实需要引用外部对象,在不需要使用时手动解除循环引用。