简单理解 js 闭包,只要记住一句话两个表现

1,184 阅读1分钟

简单理解 js 闭包,只要记住一句话两个表现

一、什么是闭包

一个函数和对其周围状态的引用捆绑在一起,这样的组合就是闭包closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

上面这段话来自 MDN,有点抽象,可以先不管,大概知道就行。

解读一下就是:闭包是一个组合:一个函数 + 周围状态的引用

二、一句话两个表现

先记住一句话就行:闭包最常见的两个表现就是,函数作为参数被传递,函数作为返回值被返回

表现一:函数作为参数被传递

function aFn(fn) {
  const aaa = 100,
    bbb = 200
  fn()
}

const aaa = 0,
  bbb = 0
function bFn() {
  console.log(aaa, bbb) // 0 0
}
aFn(bFn)

表现二:函数作为返回值被返回

function cFn(fn) {
  const ccc = 100,
    ddd = 200
  return function () {
    console.log(ccc, ddd) // 100 200
  }
}

const ccc = 0,
  ddd = 0
const dFn = cFn()
dFn()

三、帮助理解的小提示

  1. 闭包实际上变量作用域应用的特殊情况。

  2. 闭包自由变量的查找,是在函数定义的地方向上级作用域查找,而不是在执行的地方向上级查找。

  3. 自由变量:当前作用域未定义的变量。

  4. 函数执行的上下文,不是本身的词法作用域。

    function a() {
      const c = 'ccc'
      return function () {
        console.log(c)
      }
    }
    const b = a()
    b() // b 函数的执行上下文是 window,但是它的本身的词法环境在它定义的地方,即 a 函数 return 的 function