閉包
- 閉包(Closure):可以在另一個作用域中調用一個函數的内部函數并通路到該函數的作用域中的成員
// 通常函數調用在函數 makeFn 執行完後,函數 makeFn 裡面定義的成員 msg 就會被釋放掉
function makeFn () {
let msg = 'Hello function'
}
// 高階函數-函數作為傳回值
// 函數 makeFn 的調用傳回了一個函數 function,而且這個函數 function 還通路了它外部函數
// makeFn 内定義的成員 msg,這就是閉包
function makeFn () {
let msg = 'Hello function'
return function () {
console.log(msg)
}
}
// 函數 makeFn 的外部對 makeFn 的内部的成員有引用,那 makeFn 的内部的成員就不能被釋放掉
// 因為 fn 的調用 fn() 會要通路到 makeFn 内部的成員 msg
const fn = makeFn()
fn()
了解上抓住兩點:
❅ 在另一個作用域中可以去調用函數 makeFn 作用域中的内部函數 function
❅ 在調用内部函數 function 時,function 要可以通路到 makeFn 的内部成員
閉包的核心作用:
❅ 把 makeFn 函數中内部成員的作用範圍延長
閉包的本質:
❅ 函數在執行的時候會放到一個執行棧上,當函數執行完畢之後會從執行棧上移除,但是堆上的作用域成員因為被外部引用不能釋放,是以内部函數依然可以通路外部函數的成員
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iY3EmMjJ2YyUmZ2ATYzQjZ2cTO5MmYhV2NhFGM5UmYx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)