闭包
一.什么是闭包
函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。
通俗的说,闭包是一个函数,它可以访问其它函数作用域中的变量。
二.闭包的本质
函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员。
闭包案例
//计算随机数字的多少幂次方
function makePower (power) {
return function (x) {
return Math.pow(x, power)
}
}
let power2 = makePower(2)
let power3 = makePower(3)
power2(2) //4
power3(2) //8
//只执行一次
function once (fn) {
let done = false
return function () {
if (!done) {
done = true
return fn.apply(this, arguments)
}
}
}
let pay = once(function (money) {
console.log(`支付:${money} RMB`)
})
pay(5)//输出> 支付:5 RMB
pay(5)//输出> 空