“说说闭包”

JavaScript---什么是闭包?为什么使用闭包?闭包产生的问题

1.什么是闭包

闭包 是有权限访问其他函数作用域内变量的函数------------《JavaScript高级程序设计》

如果在面试过程中,短短的一句话并不会让面试官认为你真的懂,针对这句话还可以引出"什么是函数作用域 "、"为什么闭包有这个权限"等问题

那我们可以这样说:

在JS中,变量的作用域属于函数作用域 ,即函数中的变量在函数以外是不可见的 ,正常情况下,函数执行完成,函数内部变量会销毁,内存也会被随之回收 ,但是由于闭包是建立在一个函数内部的子函数 ,它是可以访问上级作用域的,所以当内部函数(闭包)没有执行完成时,外部函数中的变量不会被销毁。

js 复制代码
// 函数嵌套函数,**内部函数就是闭包**。
 function outerFn(){
     var data = 0
     var innerFn = function(){
           data += 1
           console.log(data)
     }
     return innerFn
 }
 var result = outerFn()
 result() //1
 result() //2

2.为什么要使用闭包?

  1. 避免污染全局变量:闭包会划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,保护自己的私有变量不受外界干扰(操作自己的私有变量和外界没有关系)。

  2. 读取其他函数内的变量:如果当前上下文不被释放,那存储的这些私有变量也不会被释放,这些变量的值永远保持在内存中,不被垃圾回收。

闭包中引用到的变量永远不会被释放 ,所以我们应该在必要的时候,及时释放这个闭包函数。

闭包出现场景

闭包随处可见,一个Ajax请求的成功回调,一个事件绑定的回调方法,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包。

简而言之,无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时都有闭包的身影。

3. 闭包产生的问题?

闭包使用不当可能造成内存泄露,因为闭包中引用到的变量永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数。

内存泄露是指你用不到(访问不到)的变量,依然占据着内存空间,不能被再次利用起来。

闭包产生的内存泄露怎么办?

  1. 在退出函数之前,将不使用的局部变量赋值为null;
  2. 避免变量的循环赋值和引用。

总结

闭包是JavaScript这门语言中非常重要但又难以掌握的概念。如果掌握了闭包并运用自如的话,会让你"功力大增"。

要想完全掌握闭包,一定要清楚函数作用域、内存回收机制、作用域继承等,然而闭包是随处可见的,很可能开发者在不经意间就写出了一个闭包,理解不够深入的话很可能造成运行结果与预期不符。

Tips -> 垃圾回收

垃圾回收是一种自动的内存管理机制。当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收。

垃圾回收的方法有:

  1. 标记清除法:从根集合出发,标记处需要回收的对象,清除被标记的对象。

  2. 引用计数法 :就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,如果计数器值为0则直接回收内存。很明显,引用计数最大的优势是暂停时间短

相关推荐
JAVA9653 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
wuxia21184 小时前
微信小程序单击元素切换元素的显示和隐藏
javascript·微信小程序·setdata
JustHappy4 小时前
古法编程秘籍(二):什么是代码模块化?别背概念,把房间收拾明白就够了
前端·后端
小江的记录本4 小时前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
weixin_471383035 小时前
图片预解码缓存
前端·浏览器缓存·图片预解码
一起学开源5 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
语戚6 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
天天进步20156 小时前
Python全栈项目实战:从零构建校园心理健康咨询平台
面试·职场和发展
郑洁文6 小时前
基于网络爬虫的Web敏感信息泄露自动化检测工具
前端·爬虫·网络安全·自动化
游九尘6 小时前
JavaScript 实现三段式版本号对比函数(app升级用)
javascript·uni-app