闭包

1 阅读1分钟

闭包是 JavaScript 中函数是一等公民+词法作用域共同作用的结果。理解闭包是掌握 JavaScript 高级编程的关键,它是模块化、函数式编程、异步编程等许多核心模式的基础。

闭包的查看

image.png

经典例子对比

     for (let i = 0; i < 5; i++) {
        setTimeout(() => {
          console.log(i); // 0, 1, 2, 3, 4
        }, 1000);
      }

      for (var i = 0; i < 5; i++) {
        setTimeout(() => {
          console.log(i); // 5
        }, 1000);
      }

      for (var i = 0; i < 5; i++) {
        setTimeout(() => {
          function fn1() {
            return function () {
              /* 闭包存储的是变量的引用 */
              console.log(i); // 5
            };
          }
          fn1()();
        }, 1000);
      }

      for (var i = 0; i < 5; i++) {
        (function (j) {
          setTimeout(() => {
            console.log(j); // 0, 1, 2, 3, 4
          }, 1000);
        })(i);
      }

      for (var i = 0; i < 5; i++) {
        (function (j) {
          var a = j;
          setTimeout(() => {
            console.log(a); // 0, 1, 2, 3, 4
          }, 1000);
        })(i);
      }

      for (var i = 0; i < 5; i++) {
        (function () {
          var a = i;
          setTimeout(() => {
            console.log(a); // 0, 1, 2, 3, 4
          }, 1000);
        })();
      }

      for (var i = 0; i < 5; i++) {
        var a = i;
        setTimeout(() => {
          function fn1() {
            return function () {
              console.log(a); // 4
            };
          }
          fn1()();
        }, 1000);
      }