javascript中的闭包是什么以及有什么作用?【教程】

发布时间 - 2026-01-22 00:00:00    点击率:
闭包是JavaScript函数作用域机制自然产生的行为:一个函数能记住并访问它定义时所在的作用域,即使在别处执行;满足内层函数定义于外层函数中、引用外层局部变量、且被带出外层作用域三条件即构成闭包。

闭包不是某种语法糖或新特性,而是 JavaScript 函数作用域机制自然产生的行为:**一个函数能记住并访问它定义时所在的作用域,即使这个函数在别处执行**。 你写了一个内部函数,又把它返回出去、传给定时器、绑给事件、或者存进变量——只要它还能读到外层函数的局部变量,那它就是闭包。不需要刻意“创建”,只要满足条件,它就存在。

怎么一眼认出闭包?看三件事

判断一段代码是否构成闭包,只盯住三点:

  • 有没有一个function定义在另一个function内部;
  • 这个内层函数有没有引用外层函数的局部变量(var/let/const声明的);
  • 这个内层函数有没有被“带出”外层函数作用域(比如作为返回值、赋给全局变量、传给setTimeout等)。

三者同时满足,就是闭包。例如:

function makeAdder(x) {
  return function(y) {
    return x + y; // ← 引用了外层的 x
  };
}
const add5 = makeAdder(5); // ← 内部函数被返回并赋值
console.log(add5(3)); // 8 → 闭包生效

闭包最常用、也最容易翻车的三个场景

实际开发中,你几乎每天都在用闭包,只是没叫它名字:

  • 封装私有状态:比如createCounter()里那个count变量,外部永远碰不到,只能通过返回的函数操作——这不是设计模式,是闭包的默认能力;
  • 事件/定时器中保存上下文:循环绑定点击事件时,如果直接写for (let i = 0; i console.log(i); },靠的是let块级作用域;但如果用var,就得靠闭包“捕获”当前i值,否则全输出3
  • 缓存计算结果(memoization):像memoizedAdd()cache对象封在闭包里,每次调用都复用同一份缓存,而不是反复新建对象。

为什么有时候内存涨得快?闭包不是背锅侠

闭包本身不导致内存泄漏,但它让变量无法被垃圾回收——这是双刃剑。常见坑点:

  • 把整个DOM节点、大数组、或XMLHttpRequest实例塞进闭包,又忘了清理;
  • 在长生命周期对象(如单页应用的根组件)里反复生成闭包,每个都持有一份冗余数据;
  • setTimeoutsetInterval创建闭包后,忘记clearTimeout,导致闭包和它引用的数据一

    直活着。

检查方法很简单:打开 Chrome DevTools → Memory → Take heap snapshot,筛选“Closure”,看哪些变量意外驻留。

要不要避免闭包?别想太多,但得知道它在哪

你没法不用闭包——ReactuseStateVue的响应式依赖收集、甚至addEventListener的回调,底层都依赖闭包语义。真正该做的,是写完函数后问自己一句:这个函数会活多久?它抓着哪些东西不放?这些东西还必要吗? 答案比“是不是闭包”重要得多。


# vue  # react  # javascript  # java  # 作用域  # 点击事件  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  JS实现鼠标移上去显示图片或微信二维码  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何做网站制作流程,*游戏网站怎么搭建?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel安装步骤详细教程_Laravel环境搭建指南  如何在局域网内绑定自建网站域名?  EditPlus 正则表达式 实战(3)  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Python3.6正式版新特性预览  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  利用vue写todolist单页应用  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  公司网站制作价格怎么算,公司办个官网需要多少钱?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  html5的keygen标签为什么废弃_替代方案说明【解答】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  用v-html解决Vue.js渲染中html标签不被解析的问题  成都网站制作公司哪家好,四川省职工服务网是做什么用?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在阿里云完成域名注册与建站?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  重庆市网站制作公司,重庆招聘网站哪个好?  html如何与html链接_实现多个HTML页面互相链接【互相】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  微信小程序 canvas开发实例及注意事项  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel storage目录权限问题_Laravel文件写入权限设置  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel定时任务怎么设置_Laravel Crontab调度器配置  香港服务器租用费用高吗?如何避免常见误区?  如何在建站宝盒中设置产品搜索功能?  Laravel如何实现用户密码重置功能?(完整流程代码)  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  深圳网站制作培训,深圳哪些招聘网站比较好?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何快速打造个性化非模板自助建站?  进行网站优化必须要坚持的四大原则