闭包
- 闭包(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 函数中内部成员的作用范围延长
闭包的本质:
❅ 函数在执行的时候会放到一个执行栈上,当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员