常识来了
白蓝主题五 · 清爽阅读
首页  > 软件进阶

JavaScript代码闭包理解:一个让你变量“私有”的小技巧

你有没有写过这样的ref="/tag/131/" style="color:#2B406D;font-weight:bold;">代码:一个函数里定义的变量,想在外部也能访问?或者,你写了个计数器,但每次调用都重置了,根本记不住之前加了多少?

其实,JavaScript 有个叫“闭”的特性,能帮你轻松解决这类问题。别被名字吓到,它没那么玄乎。

什么是闭包?

简单说,闭包就是函数记住了它出生时所在的环境。哪怕这个函数被带到别的地方执行,它还能访问原来作用域里的变量。

举个生活里的例子:你去朋友家做客,看到他书桌上放着一本日记。你不能直接翻,但他允许你通过他来读某一页的内容。这本日记就是“私有数据”,而他提供的读取方式,就像一个闭包函数。

一个简单的计数器例子

来看段代码:

function createCounter() {
    let count = 0;
    return function() {
        count++;
        console.log(count);
    };
}

const counter = createCounter();
counter(); // 输出 1
counter(); // 输出 2
counter(); // 输出 3

这里 createCounter 执行完后,按理说里面的 count 该被回收了。但因为返回的函数内部用了它,所以 JavaScript 把这个变量“关”在里面不让走——这就是闭包。

为什么有用?

闭包让变量不会被外界随意修改,又能让特定函数持续使用。比如你写个登录模块,用户信息不想暴露给全局,但又要供几个内部方法调用,闭包就特别合适。

再比如,前端开发中常见的事件回调、定时任务,经常依赖闭包来保存当时的状态。

注意别滥用

闭包虽然好用,但也可能带来内存问题。如果大量闭包引用着大对象,而这些对象又不再需要,却无法被回收,就会造成内存泄漏。就像你出门总带着家里的冰箱,虽然方便,但太占地方。

所以,用完的引用记得手动清空,尤其是 DOM 元素或大型数据结构。

小结一下长啥样

当你看到一个函数返回另一个函数,并且内层函数用了外层的变量,基本就可以说是闭包了。它是 JavaScript 灵活的一部分,也是很多高级功能的基础。