1.2.3.17.了解閉包(一)
為什麼sayHi會知道whattosay是甚麼?
執行程式
行1 ~ 5:全域執行環境 (global Execution context)被建立, 並存放greet()
行6:
建立新的執行環境, 記憶體會空出whattosay,並賦值 (whattosay: 'Hi')後回傳 (行2 ~ 4)
greeting 的執行環境離開執行堆, 但記憶體還會在, 因此whattosay還在
行7:
呼叫sayHi所指向的函數
全域執行環境 (global Execution context)會存放sayHi, 匿名函數
創造新的執行環境, 記憶體會空出name,並賦值 (name: 'Tony')
行3被執行, 這時候因為函數中沒有whattosay的定義, 根據範圍鍊的觀念會開始向外尋找, 此時還是找的到whattosay, 因為whattosay位於外部的記憶體位置
小結
1.雖然greet函數已經結束, 它裡面的函數還是可以參考到greet函數在記憶體中的位置到執行環境中記憶體的位置
2.執行環境可以把它外部變數關住, 包住, 這種包住所有可以取用的變數的現象稱為閉包
3.閉包可確保執行函數時可以正常運作, 可以取用到外部變數, 而不用在乎外部函數運行完了沒
Last updated
Was this helpful?