1. 程式人生 > 其它 >對於閉包的理解

對於閉包的理解

何為閉包

一個函式和對其周圍狀態的引用捆綁在一起(或者說函式被引用包圍),這樣的組合就是閉包(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。