闭包小结

47 阅读1分钟

本文参考了www.cnblogs.com/best/p/6206…

1.闭包是什么

当一个函数内部访问了外部作用域的变量,则称为闭包。 比如函数嵌套函数时,内层函数引用了外层函数作用域下的变量,就形成了闭包。

2.如何实现闭包

举个例子
简易版写法:

      const add2 = (function () {
        let count = 0;
        return function add() {
          console.log(count++);
        };
      })();
      add2()
      add2()
      add2()

内存图大致如下,主要关注红圈部分

由于全局对象add2对add函数对象有引用,并且该函数对象的作用域链这中有对立即执行函数产生的AO对象有引用,所以红圈部分所产生的的AO对象并不会被垃圾回收。(这里[[scopes]]内存图未画,为简化版)

image.png

加强版写法:

      const api = (function () {
        let count = 0;
        return {
          add: () => {
            count++;
          },
          sub: () => {
            count--;
          },
          get: () => count,
        };
      })();
      

用法: 变量既想反复使用,又想避免全局污染如何使用?

  • 1.定义外层函数,封装被保护的局部变量。
  • 2.定义内层函数,执行对外部函数变量的操作。
  • 3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。

3.闭包的优点

  1. 维持变量,不被垃圾回收
  2. 避免了全局污染
  3. 只提供对局部变量的间接访问。

4.闭包使用不当

由于闭包会使得函数中的变量都被保存在内存中,如果滥用闭包,会导致内存消耗很大,造成网页的性能问题。