“说说闭包”

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则直接回收内存。很明显,引用计数最大的优势是暂停时间短

相关推荐
careybobo12 分钟前
海康摄像头通过Web插件进行预览播放和控制
前端
TDengine (老段)38 分钟前
TDengine 中的关联查询
大数据·javascript·网络·物联网·时序数据库·tdengine·iotdb
杉之2 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端2 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡2 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
木木黄木木3 小时前
html5炫酷图片悬停效果实现详解
前端·html·html5
请来次降维打击!!!3 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
Alo3653 小时前
面试考点复盘(二)
面试
難釋懷4 小时前
JavaScript基础-移动端常见特效
开发语言·前端·javascript
还是鼠鼠4 小时前
Node.js全局生效的中间件
javascript·vscode·中间件·node.js·json·express