概念

函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包
可以在另一个作用域调用函数的内部函数并访问到该函数的作用域中成员

  1. // once
  2. function once (fn) {
  3. let done = false
  4. return function () {
  5. if (!done) {
  6. done = true
  7. return fn.apply(this, arguments)
  8. }
  9. }
  10. }
  11. let pay = once(function (money) {
  12. console.log(`支付: ${money} RMB`)
  13. })
  14. pay(5)
  15. pay(5)

以上定义了一个叫pay的变量,它是一个once返回的内部函数。正常情况下,函数执行后会从执行栈中移除,函数的内部成员在执行完毕之后会被释放掉。但是pay是once返回的匿名函数,而这个匿名函数引用了once中的内部成员done,在这种情况下once执行后依然会从执行栈中移除,但是done因为被外部引用,并不会被释放掉。pay延长了done的作用范围,内部函数依然可以访问外部函数的成员。