闭包:函数其周围的状态(词法环境)的引用捆绑子啊一起形成闭包。
- 可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员。
```javascript
function makefn() {
let msg = ‘Hello function’
return function() {
} } const fn = makefn() fn()console.log(msg); //访问该函数以外的变量msg 形成闭包
```javascript
//once 模拟once 只会执行一次的函数
function once(fn) {
let done = false
return function() {
//done是false的话会执行if 说明是第一次执行
if(!done) {
//执行后 将变量变为true 下一次就不会执行fn
done = true;
// ?
return fn.apply(this, arguments)
}
}
}
let pay = once(function(money){
console.log(`支付:${money} RMB`)
})
//只会支付一次
pay(5)
pay(5)
闭包的本质: 函数在执行时会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员