閉包 (Closure)
先帶例子:
function greet(whattosay){ return function (name){
console.log(whattosay+’’+name)}
}greet('Hi') //回傳一函式 ƒ (name){console.log(whattosay+''+name)}
greet(‘Hi’)(‘Tony’) //Hi Tony
_____function greet(whattosay){
return function (name){
console.log(whattosay+’’+name)}
}let sayHi = greet('Hi') //ƒ (name){console.log(whattosay+''+name)}
sayHi('Tony'); //Hi Tonywhattosay 變數被創造,當greet函數被呼叫,然後這個函數就結束了為什麼sayHi仍然知道whattosay是什麼??因為閉包現象。
當執行堆疊被清除後,一般情況下JavaScript引擎會清除記憶體空間,稱為垃圾回收(garbage collection)。
而當函數已經不在執行堆了,裡頭的函數執行環境可以包住那些他應該要參考的外部變數,這樣即使執行完畢的函數執行環境已經沒了,裡頭的函數仍然能夠取用到變數,這個包住所有可以取用的變數的現象稱為閉包。
閉包只是個JavaScript的特色,它不在乎外部函數運行完畢了沒,也與何時呼叫函數無關,我們不需擔心它的外部環境是否還在執行,JavaScript引擎永遠會確保執行函數時,它都能取用到應該要取用到的變數範圍沒有改變。