[路飞]每日一答:什么是闭包?

222 阅读2分钟

什么是闭包?

一. 如何定义闭包?

先来看一段代码:

var name = 'ouda'
function fun() {
  console.log(name) // ouda
}

fun()

在上述代码中,有一个函数 fun 和一个函数外的变量 name , 函数fun引用了 函数外的变量 name,那么我们可以认为 这个函数 fun 和 这个 变量 name组成了一个闭包。

所以个人理解,闭包就是 函数函数引用的函数外变量 的总和。

有的人可能会有疑问,我们所看到的闭包都是有 返回值,并且是一个函数整体啊。实际上这不代表整个都是闭包,而这是闭包在函数中的应用。

二. 闭包在函数中的应用。

刚刚所说到的,我们所看到的一个函数整体,他也许类似于这样的:

image.png

这里的 plus函数和 变量 number组成了一个闭包。闭包嵌套在函数 fun 内部。这样做的好处就是将闭包变量进行隐藏。可以发现,我们在外部去调用fun的时候并不能直接访问到 number ,但可以通过fun方法去修改 number

function fun() {
  var number = 1
  function plus() {
    number++
    return number
  }
  return plus
}

var func = fun()
console.log(func()) //2
console.log(func()) //3

不能直接访问的变量 number 通过一次调用就增加了1,在实际开发中可以最有效的保护变量不被随意更改。

三. 关于闭包内存泄露的讨论

其实关于这个问题,我也翻看过一些资料和一些讨论。比较赞成下面一种说法:

说这话的人根本不知道什么是内存泄露。内存泄露是指你用不到(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。

闭包里面的变量明明就是我们需要的变量(lives),凭什么说是内存泄露?

这个谣言是如何来的?

因为 IE。IE 有 bug,IE 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。

这是 IE 的问题,不是闭包的问题。参见司徒正美的这篇文章

这里不做过多的讨论了。毕竟各有各的想法。