閉包(closure),即當使用高階函式(function中有function、function回傳function)時,可以將外層函式裡宣告的變數&值「包進來」=>保留到內層函式使用。
閉包的本質,建立於範圍鏈(Scope chain)的設計之上。其中一種範圍鏈現象,就是前文『Day-12 函式與變數』 曾經提過的「函式變數未宣告,往外變全域」現象。完整
說明請另參考:
『[JavaScript] Javascript 的作用域 (Scope) 與範圍鏈 (Scope Chain):往外找』
例:setTimeout與加法器
// 外層函式 = a
function a() {
var x = 123
// closure 閉包
// 內層函式 = setTimeout
setTimeout(() => {
console.log(x)
}, 1000)
}
a()
x 本來會隨著外層的泡泡破掉而消失,但 JS 卻能把 x 一起帶到 WebAPI 排隊。
意者另可參考:『所有的函式都是閉包:談 JS 中的作用域與 Closure』