对于闭包的理解

何为闭包

一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

作用域

  function outer () {
    const outerName = "is Outer var"; // outerName 是一个被 outer 创建的局部变量
    function inner () { // inner() 是outer内部的函数,一个闭包
        alert(outerName); // 使用了父函数中声明的变量
    }
    inner();
  }
  outer();

拷贝这段代码到浏览器控制台,发现会弹出outerName的内容。以上写法很常见。inner() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 inner() 可以使用父函数 outer() 中声明的变量 outerName 。嵌套函数可访问声明于它们外部作用域的变量。
再看一段例子

闭包

  function outer() {
    const outerName = "is Outer var2";
    function inner() {
        alert(outerName);
    }
    return inner;
  }

  const myFn = outer();
  myFn();

运行这段代码效果和之前那段代码效果完成一样,也开业弹出outerName的内容。我们发现不同点在于。outer方法会返回inner方法,
调用myFn时还是可以访问到outer作用域块内的outerName这就是闭包

闭包私有方法

再看一段例子

  function outer() {
    let outerName = "is Outer var";
    function inner(arg) {
      outerName = outerName + arg
      console.log(outerName)
    }
    return inner;
  }

  const myFn1 = outer();
  myFn1(100)
  const myFn2 = outer();
  myFn2(200)

  // is Outer var100
  // is Outer var200

运行代码。发现 myFn1myFn2 运行时、各自调用 inner 中的 outerName是相互独立的,每个闭包都是引用自己词法作用域内的变量 outerName。

posted @ 2021-11-08 15:39  skylei  阅读(86)  评论(0)    收藏  举报