闭包

70 阅读1分钟

闭包是指有权访问另外一个函数作用域中的变量的函数。可以理解为(能够读取另一个函数作用域的变量的函数)

闭包必须满足三个条件: 1、必须有一个内嵌函数 2、内嵌函数必须引用外部函数嵌套函数的变量 3、外部函数的返回值必须是内嵌函数

闭包的优点: 1、持久化内存,保存数据 2、形成私有空间,避免全局变量的污染 3、可以访问到函数内部的局部变量; 4、逻辑连续性。当闭包用作另一个函数调用的参数时,它会阻止您独立于当前逻辑编写额外的逻辑;

闭包的缺点: 1、对内存消耗有负面影响,因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大内存使用量,所以使用不当会导致内存泄漏; 2、对处理速度具有负面影响。闭包的层级决定了引用的外部变量在查找时经过的作用域长度; 3、可能获取到意外的值。

解决:1、尽快避免函数的嵌套,以及变量的引用 2、执行完的变量,可以赋值null,让垃圾回收机制,进行回收释放内存(当不在引用的变量,垃圾回收机制就会回收)

      例: 点击li获取当前下标
<ul>
  <li>111</li>
  <li>222</li>
  <li>333</li>
  <li>444</li>
  <li>555</li>
</ul>
  var lis = document.querySelectorAll('li')
  for (var i = 0; i < lis.length; i++) {
    (function (j) {
      lis[j].onclick = function () {
        console.log(j)
      }
    })(i)
  }