1.什么是闭包?
闭包就是:函数+定义函数的词法环境
有的解释说:这个函数必须是定义在一个函数中的函数
2.什么是内存泄漏?
因为JS有垃圾回收,内存中无法触达但垃圾回收无法回收的内存空间,会造成内存泄漏。在JS中还有一种情况,不在使用的内存但没有手动置为null,这部分内存永远不会被回收,也会被认为是内存泄漏。
3.闭包会造成内存泄漏的情况?
情况一:错误的持有本该被销毁的函数引用,会导致函数关联的词法环境无法销毁,造成内存泄漏。
情况二:多个函数共享词法环境时,可能造成词法环境膨胀,这就可能出现无法触达且无法销毁的内存,造成内存泄漏。
情况一
function a(){
let b = 123;
function fun{
console.log(b);
}
return fun;
}
const c = a();
c();
当调用c后,后面的代码不在使用c了,但c一直保持函数的引用,永远不会被销毁,造成内存泄漏。
类似的情况还有:
1.未被销毁的定时器
2.没有使用var定义的变量,直接挂在window上
情况二
function run(){
const arr = new Array(100000).fill(0);
const a='';
let b =1 ;
function fun(){
debugger;
}
function temp(){
//该函数使用了用到了arr
}
return fun;
}
const f = run();
f();
fun 和temp共享一个作用域,fun沒有使用到arr,但是temp使用到了arr,所以在共享的作用域中arr沒有被销毁但又无法触达,造成內存泄漏。