什么是闭包?
闭包是定义在一个函数内部的函数,它是一个可以读取其他函数内部的变量的函数
闭包的用途是什么?
1.可以访问函数外部的变量。
function f1(){
let n=999;
function f2(){
alert(n); //999
}
}
如上代码中f2()可以访问f1()中的变量
2.可以让这些变量的值始终保持在内存中
function f1(){
let n=999;
nAdd=function(){n+=1}//全局变量
function f2(){
alert(n);
}
return f2;
}
let result=f1();
result(); // 999
nAdd();
result(); // 1000
在如上代码中,result()第一次的值是999,第二次的值是1000。这证明f1()中的n一直保存在内存中,并没有在f1调用后被自动清除。因为f1()是f2()的父函数,而f2()被赋给了一个全局变量,f2()的存在依赖于f1(),因为f2()始终在内存里,所以f1()也始终在内存中,不会在调用结束后被自动清除。
3.它可以将内部函数和外部函数连接起来。
闭包的缺点是什么?
1.闭包会让获取到的变量值始终保持在内存中,所以占的内存比较大
//这段代码会导致内存泄露
window.onload = function(){
let el = document.getElementById("id");
el.onclick = function(){
alert(el.id);
}
}
//解决方法为
window.onload = function(){
let el = document.getElementById("id");
let id = el.id; //解除循环引用
el.onclick = function(){
alert(id);
}
el = null; // 将闭包引用的外部函数中活动对象清除
}
在退出函数之前,将不使用的局部变量全部删除,可以使变量赋值为null