闭包

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。

在闭包中有这两种使用方式,根据MDN所说的

函数和对其周围状态的引用捆绑在一起构成闭包

  • 在返回一个函数时,他所使用的变量是根据函数定义时所在位置向上寻找.并不是在执行的时候
// 函数作用返回值
function create () {
   const a = 100
   return function () {
     console.log(a)
   }
}

const fn = create()
const a = 200
fn() // 100
// 函数作为参数返回
function print (fn) {
  let a = 200
  fn(a)
}

let a = 100
function fn () {
  console.log(a)
}

print(fn)  // 100
  • 由于他能读取另一个作用域的变量,所以常常使用它来隐藏变量
// 闭包隐藏数据, 只提供 API
function creatCache() {
  const data = {} // 闭包中的数据, 被隐藏不被外界访问
  return {
    set: function (key, val) {
      data[key] = val
    },
    get: function (key) {
      return data[key]
    }
  }
}

const c = creatCache()
c.set('a', 100)
console.log(c.get('a'))
  • 注意点
    • 闭包会将函数及变量都存在内存中,对于内存消耗很大,所以不能滥用闭包
原文地址:https://www.cnblogs.com/pamela1226/p/13445581.html