克服JS奇怪的部分_ 瞭解閉包(一)

Huang Pei
3 min readOct 27, 2019

--

閉包 (Closure)

本筆記出自:JavaScript 全攻略:克服 JS 的奇怪部分

先帶例子:

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 Tony
whattosay 變數被創造,當greet函數被呼叫,然後這個函數就結束了為什麼sayHi仍然知道whattosay是什麼??因為閉包現象。
當greet執行完return後離開執行堆疊
執行堆疊結束但記憶體空間還在
即使greet已離開執行堆,裡面的函數仍然可以參考到greet函數在記憶體位置中的whattosay變數

當執行堆疊被清除後,一般情況下JavaScript引擎會清除記憶體空間,稱為垃圾回收(garbage collection)。

而當函數已經不在執行堆了,裡頭的函數執行環境可以包住那些他應該要參考的外部變數,這樣即使執行完畢的函數執行環境已經沒了,裡頭的函數仍然能夠取用到變數,這個包住所有可以取用的變數的現象稱為閉包。

閉包只是個JavaScript的特色,它不在乎外部函數運行完畢了沒,也與何時呼叫函數無關,我們不需擔心它的外部環境是否還在執行,JavaScript引擎永遠會確保執行函數時,它都能取用到應該要取用到的變數範圍沒有改變。

一些零零總總的:覺得不錯的文章1覺得不錯的文章2

Jonas JS 課程的閉包定義
Closure is nothing but function with reserved data.

--

--

Huang Pei
Huang Pei

Written by Huang Pei

記錄用倉庫,歡迎指正。菜鳥前端,最菜的那種(超能力少女です)。

No responses yet