闭包小笔记

109 阅读1分钟

什么是闭包?

闭包是定义在一个函数内部的函数,它是一个可以读取其他函数内部的变量的函数

闭包的用途是什么?

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

2.闭包会在父函数外部改变父函数内部变量的值。