# 一个例子来认识闭包是什么,为什么需要它

假设有一个需求,需要在页面上显示一个浏览时间,从打开页面的瞬间开始计时,每过一秒加一。

本质上说,这个业务就是一个累加器,每过一秒自增一次。

首先最简单的 「每隔一秒加一」 ,我们立刻想到的是使用计时器,每隔一秒调用一起累加器函数:

let second = 0

function counter() {
  second++
}

setInterval(function() {
  // 调用累加器
  counter()
}, 10000)

可以看到我们已经实现了所需要的功能, 这也是 最低级 的实现方法。

为什么说是 最低级呢 ,因为我们实现功能的思路是定义一个 全局变量 ,每次累加都是在更新这个全局变量。而软件开发中有一条不成文的规定就是: 尽可能少定义全局变量

大致有两个原因:

  • 难以控制 :可以在任何地方进行读写,意味着可能会被不相干的函数改写;
  • 占用内存 :全局变量占用内存的生命周期长。一般局部变量在函数调用完毕之后都会被垃圾回收器回收释放;而全局变量因为可以在任何地方进行读写,因此垃圾回收器很难做出是否应该释放全局变量的判断,因此全局变量会一直占用内存。

综上所述,我们接下来要做的工作就是实现功能的同时, 避免定义全局变量污染环境