定义:函数A返回了一个函数B,函数B中使用了函数A的变量,且函数B在外部环境中执行,就产生了一个闭包。简单理解闭包其实就是等于一个函数+局部变量,实际使用过程中主要用来封装变量。
优点:1.可以访问到函数内部的局部变量,
2.可以避免全局变量的污染,
3.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
缺点:会增大内存使用量,滥用闭包会影响性能,导致内存泄漏等问题。
解决方法:在退出函数之前,将不使用的局部变量全部删除
function fn(){
let a=1;
return function(){
console.log(a)
}
}
var fn2=fn();
fn2();
fn2();
内存泄漏:某些变量、函数等不再需要占用内存的时候,由于某些原因,内存没有被回收。
变量始终存在的原因:虽然函数A已经弹出了调用栈,JS引擎会通过逃逸分析将函数A中的变量存储在堆上,函数B访问的是堆上的变量值。