JavaScript 闭包
文章目录JavaScript 闭包定义三大特性用法数据私有化函数工厂防抖节流内存泄露问题场景一长期缓存场景二未解绑DOM事件监听场景三未清理定时器JavaScript 闭包定义闭包 内部函数 持有外部函数作用域的引用函数嵌套内层函数引用外层函数作用域里的变量内层函数被外层函数持有如return出去functionouter(){letcount0// 外层函数的变量functioninner(){count// 内层函数引用外层函数变量console.log(count)}returninner// 把内层函数返回出去}constfnouter()// outer()执行完后count不会被销毁fn()// 1fn()// 2fn()// 3三大特性内部函数可以访问外部函数作用域的变量外部函数执行完后它的作用域不会被垃圾回收因为闭包函数持有引用每个闭包都是独立的作用域用法数据私有化functioncreateCounter(){letcount0return{increment:()count,get:()count}}constcountercreateCounter()counter.increment()console.log(counter.get())// 1函数工厂functionadd(base){returnfunction(b){returnfunction(c){returnbasebc}}}constadd5add(5)constadd56add5(6)constresultadd56(7)console.log(result)// 18防抖节流防抖每次输入都充值计时器延迟后才执行1次节流每个时间段只执行1次// 防抖停止操作 n ms 后才执行functiondebounce(fn,delay300){lettimernull;// ← 闭包变量多次调用共享returnfunction(...args){clearTimeout(timer);// 每次进来清掉上一个timersetTimeout((){fn.apply(this,args);},delay);};}// 节流每 n ms 最多执行一次functionthrottle(fn,interval300){letlastTime0;// ← 闭包变量记录上次执行时间returnfunction(...args){constnowDate.now();if(now-lastTimeinterval){lastTimenow;fn.apply(this,args);}};}内存泄露问题场景一长期缓存functionbigData(){consthugenewArray(1000000).fill(data);// 大数组returnfunction(){console.log(huge.length);}}window.fnbigData();// fn挂在全局永远不会释放huge一直占内存原因fn挂在全局永远不会释放huge一直占内存。解决window.fnnull;场景二未解绑DOM事件监听functioncreateElement(){constelementdocument.getElementById(button);constlargeData{name:Tom,age:18};element.addEventListener(click,(){console.log(largeData);});returnelement;}原因element 引用了事件监听器函数的引用事件监听器引用了 largeData 变量导致内存泄露。解决一functioncreateElement(){constelementdocument.getElementById(button);constlargeData{name:Tom,age:18};consthandleClick(){console.log(largeData);};element.addEventListener(click,handleClick);return{element,destroy:function(){element.removeEventListener(click,handleClick);}};}constcomponentcreateElement();component.destroy();// 取消事件document.body.removeChild(component.element);// 移除dom元素component.elementnull;// 断开引用解决二constdataMapnewWeakMap();functioncreateElement(){constelementdocument.getElementById(button);constlargeData{name:Tom,age:18};dataMap.set(element,largeData);element.addEventListener(click,(){console.log(dataMap.get(element));});returnelement;}letelementcreateElement();document.body.removeChild(element);elementnull;// WeakMap会自动清理场景三未清理定时器lettimernull;functionsetup(){consthugeDataloadHugeData();timersetInterval(()console.log(hugeData.length),1000);}functiondestroy(){clearInterval(timer);timernull;}

相关新闻

同一辆车为什么被算几百次?我给 YOLO 加了 ByteTrack 目标跟踪

同一辆车为什么被算几百次?我给 YOLO 加了 ByteTrack 目标跟踪

项目地址: yolo-object-detection-lab:基于 FastAPI 与 Ultralytics YOLO 的图像目标检测实验项目 - AtomGit 上一篇我已经把 YOLO 从图片检测扩展到了视频检测。 当时视频检测已经可以完成: Video Upload → YOLO Detection → Video Progress → De…

2026/10/11 4:32:15 阅读更多 →
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 8 章 机器码与汇编语言 阅读笔记 8

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 8 章 机器码与汇编语言 阅读笔记 8

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 8 章 机器码与汇编语言 阅读笔记 8 我们已经介绍了计算机的物理部分:内存、CPU和 I/O 设备。 理解计算机的硬件部分很重要,但是硬件只起一半作用。 计算机的魔力在于软件。 软件把…

2026/10/11 4:32:15 阅读更多 →
游戏化编程学习:CodeCombat如何用即时反馈重塑编程入门体验

游戏化编程学习:CodeCombat如何用即时反馈重塑编程入门体验

编程这个事儿,一开始最吓人的不是语法,而是那种“写完代码却不知道自己到底在干嘛”的虚无感。刷题平台把知识点切成碎片,刷完几十道题,感觉自己是熟练工,但真要写一个活着的东西,立刻抓瞎。后来我接触了 C…

2026/10/11 4:31:15 阅读更多 →

最新新闻

太原网站建设哪家支持二次开发?

太原网站建设哪家支持二次开发?

不少太原企业搭建网站后,都会面临功能升级、系统对接、业务迭代的需求,因此选择支持二次开发的建站服务商至关重要。在太原本地建站机构中,科辉荣盛凭借成熟的技术体系和透明的服务模式,成为企业二次开发建站的优选品牌。深耕太原…

2026/10/11 6:05:00 阅读更多 →
08-软件项目管理

08-软件项目管理

第 8 章 软件项目管理 学习目标 掌握软件成本估算的常用方法(专家判断、功能点、COCOMO、类比)理解进度计划(CPM/关键路径)与缓冲管理掌握风险识别、量化与应对理解敏捷与传统项目在计划与度量上的差异熟悉团队组织与沟通管理要点掌握项目沟通与期望管理8.0 项目管理与过程的关…

2026/10/11 6:05:00 阅读更多 →
10-软件维护与逆向工程

10-软件维护与逆向工程

第 10 章 软件维护与逆向工程 学习目标 掌握软件维护的四种类型及占比规律理解"退化"与"技术债"的累积机制掌握逆向工程、再工程(重构)的技术路线了解遗留系统现代化的策略(绞杀者模式等)理解软件生命周期的终止(EOL)决策掌握维护工程的具体活动(影响分析、…

2026/10/11 6:05:00 阅读更多 →
黑盒测试必学:等价类划分法与边界值分析实战指南

黑盒测试必学:等价类划分法与边界值分析实战指南

1. 为什么等价类划分法能成为黑盒测试里的“重点课”我在带新人做测试的时候,几乎每次都会从等价类划分法讲起。原因很简单:黑盒测试的核心矛盾是“输入空间太大了,根本测不完”,而等价类划分法是解决这个矛盾的第一把钥匙。黑盒测…

2026/10/11 6:05:00 阅读更多 →
企业文化案例:12 个海外企业的文化建设实践

企业文化案例:12 个海外企业的文化建设实践

企业文化,是一个组织共同秉持的信念与行为方式。它或许是打造一支快乐、敬业、愿意长期与企业共同成长的员工队伍最重要的因素。 营造高效的工作环境,需要多方面的努力,但优秀的企业文化往往有一个共同的核心:以人为本。企业如何对…

2026/10/11 6:05:00 阅读更多 →
开发指南:Git日常维护与常用命令

开发指南:Git日常维护与常用命令

一、前言在企业项目里,会用 git add、git commit 和 git push,通常只能完成“把代码交上去”。真正影响开发效率的,是后面的事情:同事之间同时修改同一个文件导致代码冲突怎么办?需求做到一半,线上出了故障…

2026/10/11 6:04:00 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →