闭包:函数其周围的状态(词法环境)的引用捆绑子啊一起形成闭包。

    • 可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员。 ```javascript function makefn() { let msg = ‘Hello function’ return function() {
      1. console.log(msg); //访问该函数以外的变量msg 形成闭包
      } } const fn = makefn() fn()
    1. ```javascript
    2. //once 模拟once 只会执行一次的函数
    3. function once(fn) {
    4. let done = false
    5. return function() {
    6. //done是false的话会执行if 说明是第一次执行
    7. if(!done) {
    8. //执行后 将变量变为true 下一次就不会执行fn
    9. done = true;
    10. // ?
    11. return fn.apply(this, arguments)
    12. }
    13. }
    14. }
    15. let pay = once(function(money){
    16. console.log(`支付:${money} RMB`)
    17. })
    18. //只会支付一次
    19. pay(5)
    20. pay(5)

    闭包的本质: 函数在执行时会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员