尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
闭包(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 等语言实现高级抽象的重要基础。理解闭包也就理解了作用域、生命周期和函数式编程的核心思想。
RELATED

相关推荐

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

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

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

📅 2026/10/23 20:53:54
Vue SPA后台管理系统登录鉴权实战:从axios封装到路由守卫

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

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

📅 2026/9/28 21:07:30
【故障诊断】【pytorch】基于CNN-LSTM故障分类的轴承故障诊断研究[西储大学数据]附Python代码

【故障诊断】【pytorch】基于CNN-LSTM故障分类的轴承故障诊断研究[西储大学数据]附Python代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

📅 2026/9/10 9:42:57
MORE NEWS

更多资讯

📰

cachebench实战:Linux缓存层级性能测试、避坑与回归基线

简介:LLCbench 是一套面向 Linux 平台的底层表征基准测试工具,集成了 MPBench、CacheBench 与 BLASBench,此处聚焦其中的 CacheBench,用于评估处理器缓存层次与内存访问性能。适合系统软件、体系结构方向的学习者和开发者开展性能…

📰

UEFI开机图标替换实战:HackBGRT原理、配置与回滚避坑

简介:这是一份围绕 Windows 10 开机 LOGO 个性化定制的小型工具包,面向希望替换系统启动画面、且具备基本动手能力的用户与开发者。压缩包共 20 个文件,约 73KB,主体由 C# 与 C 源码(cs、c、h)构成&#xf…

📰

云安全ACA备考指南:责任分担模型与WAF防护知识地图

简介:这份阿里云云安全助理工程师ACA复习资料面向备考阿里云ACA认证的初学者与云计算运维人员,帮助系统梳理云平台安全的知识框架与考点脉络。资源为单个docx文档,压缩包约1.25MB,内容按章节组织,涵盖云平台使用安全与…

📰

分析力学核心解析:广义坐标、拉格朗日方程与守恒量

1. 为什么系列走到这里,必须聊分析力学写这个系列之前五篇的时候,我一直把重点放在牛顿力学的框架里:受力分析、动量定理、角动量定理、能量守恒、刚体的平面运动、转动惯量的计算……这些都是“力”的语言。到了第六篇,该换一套叙…

📰

Flink报错/bin/flink No such file or directory的完整排查指南

刚在群里又看到有人发这条报错截图:监控脚本跑了半夜报/bin/flink: No such file or directory,然后任务直接中断,数据链路断了一大截。这报错在 Flink 运维场景里属于“出现频率极高、坑点极隐蔽”的典型,很多人在/bin/flink这个…

📰

协同克里金法原理与ArcGIS实战:破解多变量空间插值失效之谜

简介:本资源是一份面向GIS专业学习者、科研人员及空间分析从业者的ArcGIS协同克里金法系统教程,聚焦解决多变量空间插值精度不足的问题,适用于环境监测、资源评估、地理国情分析等实际场景。内容深入解析普通协同克里金法的数学假设&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬