1.2.3.17.了解閉包(一)

  • 為什麼sayHi會知道whattosay是甚麼?

      1 function greet(whattosay) {
      2     return function(name) {
      3         console.log(whattosay + '' + name);
      4     }
      5 }
      6 var sayHi = greet('Hi');
      7 sayHi('Tony');
    • 執行程式

      • 行1 ~ 5:全域執行環境 (global Execution context)被建立, 並存放greet()

      • 行6:

        • 建立新的執行環境, 記憶體會空出whattosay,並賦值 (whattosay: 'Hi')後回傳 (行2 ~ 4)

        • greeting 的執行環境離開執行堆, 但記憶體還會在, 因此whattosay還在

      • 行7:

        • 呼叫sayHi所指向的函數

        • 創造新的執行環境, 記憶體會空出name,並賦值 (name: 'Tony')

        • 行3被執行, 這時候因為函數中沒有whattosay的定義, 根據範圍鍊的觀念會開始向外尋找, 此時還是找的到whattosay, 因為whattosay位於外部的記憶體位置

  • 小結

    • 1.雖然greet函數已經結束, 它裡面的函數還是可以參考到greet函數在記憶體中的位置執行環境中記憶體的位置

    • 2.執行環境可以把它外部變數關住, 包住, 這種包住所有可以取用的變數的現象稱為閉包

    • 3.閉包可確保執行函數時可以正常運作, 可以取用到外部變數, 而不用在乎外部函數運行完了沒

Last updated