sailor0913

须知少时凌云志,曾许人间第一流

什么是闭包

发布于 # 编程 # JavaScript

某世界第一大运动,我们称呼它为“足球”,而英国人称呼它“football”,但其本质概念就是“用脚踢的一种球”。只不过每个国家对它的称呼不同而已。同样道理,闭包也是一种概念/机制(用脚踢的一种球),很多编程语言都可以实现闭包。

1、之所以会有闭包这个概念,是因为编程语言的一些特性,来看下面的代码表达的信息:

const a = 0
function outer() {
  alert(a)
}
outer()

2、那如果我把 let a = 0 放到 outer 函数内部并且把 alert(a)放到 outer 函数外部,会发生什么呢?

function outer() {
  const a = 0
}
alert(a)

3、那么问题来了,如果我一定想在 outer 函数外部访问到 a,该怎么办呢?先上代码:

function outer() {
  const a = 1
  function inner() {
    alert(a)
  }
  return inner
}
const r = outer()
r()

4、如果上面的三段代码你都能看懂,那么我现在告诉你第三段代码中的 inner 函数就是“闭包”,当然这里是用代码解释的。如果用文字解释的话,我的理解就是闭包就是可以读取其他函数内部变量的函数,上面的 inner 函数可以读取 outer 函数内部的变量 a,所以 inner 函数就是闭包。

5、总结:闭包就是让我们可以在外部访问到函数内部的变量,这样我们就可以在外部操作函数内部的变量,这样就可以实现一些特殊的功能。

6、顺便扔一个思考题,下面的代码为什么不能 alert 出 a 的值?

function outer() {
  const a = 1
  function inner() {
    alert(a)
  }
  return inner
}
outer()