news 2026/9/26 4:31:47

03.闭包和内存泄漏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
03.闭包和内存泄漏

让人迷惑的闭包

闭包是 JavaScript 中一个非常容易让人迷惑的知识点

对于那些有一点 JavaScript 使用经验但从未真正理解闭包概念的人来说,理解闭包可以看作是某种意义上的重生,但是需要付出非常多的努力和牺牲才能理解这个概念。

回忆我前几年的时光,大量使用 JavaScript 但却完全不理解闭包是什么,总感觉这门语言有其隐蔽的一面,如果能够掌握将会功力大涨,但讽刺的是我始终无法掌握其中的门道,还记得我曾经大量阅读早期框架的源码,试图能够理解闭包的工作原理,现在还能回忆起我的脑海中第一次浮现出关于“模块模式”相关概念时的激动心情。

闭包确实是 JavaScript 中一个很难理解的知识点,接下来我们就对其一步步来进行剖析,看看它到底有什么神奇之处。

JS 中函数是一等公民

在 JavaScript 中,函数是非常重要的,并且是一等公民

  • 意味着函数的使用是非常的灵活的
  • 函数可以作为另外一个函数的参数,也可以作为另外一个函数的返回值来使用

将函数作为另外一个函数的参数

functionfoo(a){a()}functionbar(){console.log('bar')}foo(bar)functioncalc(num1,num2,calcFn){console.log(calcFn(num1,num2))}functionadd(num1,num2){returnnum1+num2}functionsub(num1,num2){returnnum1-num2}functionmul(num1,num2){returnnum1*num2}varm=30varn=20calc(m,n,add)calc(m,n,sub)calc(m,n,mul)

函数作为返回值的使用

// js 语法允许函数内部再定义函数functionfoo(){functionbar(){console.log('bar')}returnbar}varfn=foo()fn()functionmakeAdder(count){functionadd(num){returncount+num}returnadd}varadd5=makeAdder(5)add5(6)varadd10=makeAdder(10)varadd100=makeAdder(100)

高阶函数:一个函数如果接收另外一个函数作为参数,或者该函数会返回另外一个函数作为返回值,那么这个函数就称之为是一个高阶函数。

数组中的函数使用

// 把数组里面的偶数都挑出来varnums=[10,5,11,100,55]varnewNums=[]for(vari=0;i<nums.length;i++){varnum=nums[i]if(num%2===0){newNums.push(num)}}console.log(newNums)// 函数 function:独立的 function,我们称之为是一个函数// 方法 method:当我们的一个函数属于某一个对象时,我们称这个函数是这个对象的方法// 数组中的高阶函数// 1、filter:过滤varnewNums2=nums.filter(function(item){returnitem%2===0})// 2、map:映射varnewNums3=nums.map(function(item){returnitem*10})///3、forEach:迭代nums.map(function(item){console.log(item)})// 4、find/findIndex:查找varitem=nums.find(function(item){returnitem===11})// 5、reduce:累加nums.reduce((previousValue,currentValue,currentIndex,array)=>{returnpreviousValue+currentValue},0)

JS 中闭包的定义

闭包的概念出现于 60 年代,最早实现闭包的程序是 Scheme,那么我们就可以理解为什么 JavaScript 中有闭包:因为 JavaScript 中大量的设计是来源于 Scheme 的

在计算机科学中对闭包的定义(维基百科)

  • 闭包(Closure)又称为词法闭包(Lexical Closure)或函数闭包(function closures)
  • 是在支持头等函数的编程语言中,实现词法绑定的一种技术
  • 闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境(相当于一个符号查找表)
  • 闭包跟函数最大的区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即使脱离了捕捉时的上下文,它也能照常运行

MDN 对 JavaScript 闭包的解释

  • 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)
  • 也就是说,闭包让你可以在一个内层函数中访问到外层函数的作用域
  • 在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来

老师的总结和理解

  • 一个普通的函数,如果它可以访问外层作用域的自由变量,那么这个函数就是一个闭包
  • 从广义的角度来说:JavaScript 中的函数都是闭包
  • 从狭义的角度来说:JavaScript 中一个函数,如果访问了外层作用域的变量,那么它是一个闭包

个人拓展

自由变量(Free Variable) 是指在函数中使用,但既不是函数参数,也不是在函数内部声明的变量。

变量分类:

  • 绑定变量(Bound Variable)

    • 函数参数
    • 函数内声明的变量(let、const、var)
  • 自由变量(Free Variable)

    • 来自外层作用域的变量
    • 来自全局作用域的变量
functionfoo(){varname="foo"functionbar(){console.log("bar",name)}returnbar}varfn=foo()fn()

闭包的内存的泄漏

闭包会造成内存泄漏,其实就是引用链中的所有对象无法释放。

只要将下面的 fn 设置为 null,在 GC 的下一次检测中,它们就会被销毁掉

functionfoo(){varname='foo'varage=18functionbar(){console.log(name)console.log(age)}returnbar}varfn=foo()fn()// 解决内存泄漏fn=null// 让 fn 指向一个 0x0 的地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 16:26:00

vuespringboot基于网络环境的在线教学系统(作业考试成绩)k7p9r

目录 具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django…

作者头像 李华
网站建设 2026/9/25 7:46:06

YOLOv8 GPU显存溢出(OOM)问题排查与解决

YOLOv8 GPU显存溢出&#xff08;OOM&#xff09;问题排查与解决 在深度学习项目中&#xff0c;尤其是在使用高性能目标检测模型如 YOLOv8 时&#xff0c;开发者常常会遇到一个看似简单却极具破坏性的问题&#xff1a;GPU 显存溢出&#xff08;Out of Memory, OOM&#xff09;。…

作者头像 李华
网站建设 2026/9/20 21:00:43

华为nova15才是宠物博主本命机!清晰又还原,运动毛孩抓拍零废片

用手机给自家“毛孩子”拍照&#xff0c;最让人头疼的莫过于这两种情况&#xff1a;想抓拍它奔跑的可爱瞬间&#xff0c;结果照片一片模糊&#xff1b;或者明明它的毛发色泽鲜亮&#xff0c;拍出来却黯淡失色。如果你也有同样困扰&#xff0c;那么华为nova15系列的“风驰闪拍”…

作者头像 李华
网站建设 2026/9/24 3:32:53

YOLOv8开发者大会预告:全球技术交流盛会

YOLOv8开发者大会预告&#xff1a;全球技术交流盛会 在智能摄像头、自动驾驶和工业质检设备日益普及的今天&#xff0c;一个共同的技术挑战摆在开发者面前&#xff1a;如何在有限算力下实现高精度、低延迟的目标检测&#xff1f;答案正变得越来越清晰——YOLOv8 容器化部署。 …

作者头像 李华
网站建设 2026/9/21 21:28:54

YOLOv8插件市场构想:第三方模块自由扩展

YOLOv8插件市场构想&#xff1a;第三方模块自由扩展 在计算机视觉的战场上&#xff0c;YOLO系列早已不是“新兵”。自2015年横空出世以来&#xff0c;它凭借一次前向传播完成检测的能力&#xff0c;成了工业界实时目标检测的首选方案。而当Ultralytics推出YOLOv8时&#xff0c;…

作者头像 李华
网站建设 2026/9/11 13:25:53

揭秘R语言混合效应模型:5步实现复杂数据结构的精准建模与解读

第一章&#xff1a;揭秘R语言混合效应模型的核心概念在统计建模中&#xff0c;混合效应模型&#xff08;Mixed Effects Models&#xff09;是一种能够同时处理固定效应和随机效应的强大工具&#xff0c;尤其适用于具有层次结构或重复测量的数据。这类模型广泛应用于生物统计、社…

作者头像 李华