闭包(Closure)概念与案例
**闭包Closure**是函数式编程和许多现代语言尤其是 JavaScript、Python、Swift、Kotlin 等中的核心概念。1. 概念是什么闭包是一个函数加上它被创建时所能访问的**词法作用域lexical scope**中的变量的引用。简单说一个内部函数可以访问外部函数的变量。即使外部函数已经执行完毕、返回了内部函数依然能“记住”并使用那些外部变量。这些被“记住”的变量和内部函数一起构成了闭包。关键特征词法作用域变量的作用域在代码书写时就确定了而不是运行时。持久化外部函数的局部变量不会因为函数执行结束而被销毁只要还有闭包引用它。2. 作用是什么闭包的主要作用可以概括为作用说明数据私有化 / 封装让变量不被外部直接访问只能通过特定接口操作状态保持函数可以“记住”上一次的状态实现有状态的函数延迟执行 / 回调把函数和它的环境一起传递稍后再执行时仍能访问原来的变量工厂函数 / 函数工厂通过参数生成具有不同行为的函数模块化在没有 class 的早期语言中模拟私有变量和模块3. 能解决什么实际问题实现私有变量真正的封装在 JavaScript 中没有真正的 private 关键字ES2022 之前闭包是实现私有数据的经典方式。函数记忆上一次的计算结果 / 状态比如计数器、节流、防抖、缓存等。解决循环中的异步问题经典坑在for循环里创建多个异步回调时闭包可以正确捕获每次循环的值。高阶函数与柯里化把多参数函数变成一系列单参数函数或者实现部分应用partial application。事件处理与回调点击按钮时需要访问创建时的上下文变量。模块模式Module Pattern在早期 JS 中实现命名空间和私有成员。4. 典型案例案例 1计数器最经典functioncreateCounter(){letcount0;// 私有变量returnfunction(){// 闭包count;returncount;};}constcounter1createCounter();constcounter2createCounter();console.log(counter1());// 1console.log(counter1());// 2console.log(counter2());// 1 各自独立案例 2函数工厂根据参数生成不同行为functionmakeMultiplier(factor){returnfunction(x){returnx*factor;};}constdoublemakeMultiplier(2);consttriplemakeMultiplier(3);console.log(double(5));// 10console.log(triple(5));// 15案例 3解决循环 异步的经典问题// 错误写法所有都输出 3for(vari0;i3;i){setTimeout(()console.log(i),100);}// 用闭包修复for(vari0;i3;i){(function(j){// 立即执行函数创建闭包setTimeout(()console.log(j),100);})(i);}// 现代写法let 本身就有块级作用域for(leti0;i3;i){setTimeout(()console.log(i),100);}案例 4防抖Debouncefunctiondebounce(fn,delay){lettimernull;returnfunction(...args){clearTimeout(timer);timersetTimeout((){fn.apply(this,args);},delay);};}consthandleSearchdebounce((keyword){console.log(搜索:,keyword);},300);案例 5模块模式IIFE 闭包constCalculator(function(){letresult0;// 私有return{add(x){resultx;returnthis;},subtract(x){result-x;returnthis;},getResult(){returnresult;}};})();Calculator.add(10).subtract(3);console.log(Calculator.getResult());// 7总结闭包 函数 它诞生时的环境。它让函数拥有“记忆力”能够封装数据、保持状态、延迟执行是 JavaScript 等语言实现高级抽象的重要基础。理解闭包也就理解了作用域、生命周期和函数式编程的核心思想。

相关新闻

耗时 7 天整理 Linux 命令大全,0 基础小白也能看懂,一篇吃透所有操作

耗时 7 天整理 Linux 命令大全,0 基础小白也能看懂,一篇吃透所有操作

做软件开发的朋友,相信大家或多或少都接触过Linux,知道Linux中的命令是非常多的,但是我们也不必因此而烦恼,因为我们只需要掌握常用的命令,就可以满足我们日常工作开发了。下面汇总了果冻做开发以来最常用的32个命令&a…

2026/9/26 6:08:53 阅读更多 →
Vue SPA后台管理系统登录鉴权实战:从axios封装到路由守卫

Vue SPA后台管理系统登录鉴权实战:从axios封装到路由守卫

1. 项目概述与核心价值最近在重构一个后台管理系统,核心需求就是实现一个标准的单页应用(SPA)登录流程,并完成前后台的数据交互。这听起来像是每个Vue项目的标配,但真做起来,从路由守卫的精细控制&#xff…

2026/10/9 16:53:54 阅读更多 →
AI规则失效的根源与优化:从Prompt工程到协作协议设计

AI规则失效的根源与优化:从Prompt工程到协作协议设计

1. 从“规则失灵”说起:为什么你的AI总是不听话?最近和不少同行交流,发现一个普遍存在的困惑:我们花了不少心思,为AI助手(无论是Claude、Cursor还是其他基于大模型的工具)编写了详尽的规则文件&…

2026/10/9 8:22:51 阅读更多 →

最新新闻

Document:write() 方法(不推荐)

Document:write() 方法(不推荐)

document.write()将文本字符串写入由 document.open() 打开的文档流. 因为 document.write() 会向文档流中写入内容,所以在已关闭(已加载)的文档上调用 document.write() 会自动调用 document.open(),这将清空文档。 在未调用 d…

2026/10/11 5:06:32 阅读更多 →
二叉搜索树删除节点:递归五情况详解与Java实现

二叉搜索树删除节点:递归五情况详解与Java实现

1. 先把题目读懂:删除BST节点为什么是递归题的分水岭刷二叉树刷到一定阶段,大家都会卡在同一个地方:删除二叉搜索树中的节点。LC450这道题我第一遍做的时候,五个分类情况绕得我头晕,写出来的代码自己都害怕。后来把所有…

2026/10/11 5:06:31 阅读更多 →
MobaXterm高效运维指南:SSH、SFTP与远程图形化全掌握

MobaXterm高效运维指南:SSH、SFTP与远程图形化全掌握

1. 为什么我把终端全家桶换成了MobaXterm干开发这行,终端工具一直是个"看起来不重要、用起来天天烦"的东西。早些年我电脑上同时躺着好几个会话软件——一个负责SSH连服务器、一个负责传文件、偶尔还得开个浏览器去访问远程桌面。窗口切来切去&#xff0c…

2026/10/11 5:06:31 阅读更多 →
革命性AI科研智能体AutoSci:读论文、做实验、写论文的全生命周期自动化,一篇看懂

革命性AI科研智能体AutoSci:读论文、做实验、写论文的全生命周期自动化,一篇看懂

人工智能AI 技能/插件深度研究知识图谱MCP 服务 【免费下载链接】AutoSci Karpathys LLM-Wiki vision, fully realized — wiki-centric full-lifecycle AI research platform powered by Claude Code 项目地址: https://gitcode.com/gh_mirrors/om/AutoSci 点击查看…

2026/10/11 5:06:31 阅读更多 →
可靠性密码 | 高可靠性之光学镜架设计

可靠性密码 | 高可靠性之光学镜架设计

△ 高可靠性固体激光器激光器腔体内部光学镜架作为谐振腔镜片、反射镜、聚焦镜等核心光学元件的承载与调节部件,是决定激光器整机可靠性的关键子系统。传统镜架普遍存在热变形偏移、振动失准、螺纹蠕变、夹持应力不均等问题,极易引发光束漂移、功率衰减&…

2026/10/11 5:06:31 阅读更多 →
PyMuPDF + Qwen-VL:构建图文混排PDF的RAG检索方案

PyMuPDF + Qwen-VL:构建图文混排PDF的RAG检索方案

1. 为什么传统 PDF RAG 一到扫描件就“断片”1.1 文本提取式的 RAG 有多脆弱我最早做 PDF 知识库问答时,思路非常简单粗暴:用解析库把 PDF 里的文字抠出来,按段落切块,然后塞进向量库,查询时做相似度召回。这个方案跑纯…

2026/10/11 5:05:31 阅读更多 →

日新闻

流感时间序列预测实战: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 阅读更多 →