闭包
-
闭包:延长函数内部属性的作用域范围
-
本质:函数在执行的时候会放到一个执行栈上,当函数执行完毕后,会从执行栈上移除,但是堆上的作用域成员因为被外部引用而不能释放,因此内部函数依然可以访问函数的成员
// once函数中使用到闭包
function once(fn){
let done = false
// 外部函数once返回了一个内部函数,内部函数对外部函数的成员done进行了引用,此时就形成了闭包,外部函数的成员在函数执行完成后不会被释放
return function(){
if(!done){
done = true
return fn.apply(this,arguments)
}
}
}
let pay=once(function(money){
console.log("支付:" + money + "RMB"
})
pay(5)
pay(5)
// 输出
// 支付:5RMB