网站首页 > 技术文章 正文
对于一个前端开发者而言,闭包是面试过程中绕不过的一个高频知识点。接下来我们就来聊聊js闭包。
闭包的概念
【js闭包是一个拥有多个变量和绑定了这些变量的环境的表达式】这是官方的解释。好像有些晦涩难懂。
我来通俗的解释下【闭包】。就是有一个函数 makeFunc() 。在其里面定义了一个或多个变量。这个函数返回一个新的函数 displayName,新的函数 displayName 对外层的变量有引用关系。举个例子:
function makeFunc() { var name = '畅哥'; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc();
分析这段代码之前,我们不得不聊聊JS中的垃圾回收(GC)机制。
垃圾回收
即JS中的对象如果没有被其它对象所引用,那么这个对象会被做垃圾收回。js中的垃圾回收是自动的,一般不需要开发者来处理 (当然开发者也可以手动做垃圾回收)。通俗来讲,就是我们的JS变量是需要占用我们的计算机内存空间的,而垃圾回收则是【释放内存】,从而保证计算机资源高效应用。
知道了垃圾回收的概念,我们再来分析上面的代码。 makeFunc()函数里面有一个局部变量name ,一般来说,当makeFunc函数调用完以后,name变量会做垃圾回收。但是我们可以看到在函数里面又有一个displayName函数,并且在内部调用了alert(name);很显然,name变量已经被另外一个变量所引用。所以makeFunc调用完成以后 name变量不会被释放而一直在内存当中,会返回一个新的函数 displayName ,这样就形成了一个闭包。
当然,我们也可以这样理解,如果访问一个函数内部的局部变量?出于种种原因,我们有时候需要得到函数内的局部变量。但是,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。继续举例:
counter函数中有一个默认值为0的count变量,当counter函数调用完成之后,变量count被没有被销毁,而是一直在内存中驻留。从后面继续调用c()可以看出,count还在累加。
闭包的应用
1、解决变量提升的问题。我们知道,用var定义变量存在变量提升问题。我们就可以用闭包来解决这个问题。当然 let 另当别论了。
2、避免全局污染
(function(){ var name = ''; })();
闭包的特点及注意事项
1、作为一个函数变量的一个引用,当函数返回时,其处于激活状态,一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
2、闭包允许使用内部函数,这些内部函数可以访问它们所在的外部函数中声明的参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
3、闭包中的变量不会被释放一直保存的内存中导致对内存的资源消耗很大,所以它可能造成内存泄露的问题。要注意合理的运用。及时手动释放资源。
(全文完)
- 上一篇: 闭包的了解与使用 如何理解闭包,闭包的优缺点
- 下一篇: 前端JS进阶系列-四-作用域链与闭包
猜你喜欢
- 2025-06-23 JavaScript 开发者常犯的 10 个典型错误
- 2025-06-23 这7道问题可以检验你掌握Javascript的真正实力
- 2025-06-23 HarmonyOS NEXT 如何有效地进行内存管理和避免内存泄露?
- 2025-06-23 JS 函数柯里化(js函数柯里化面试题)
- 2025-06-23 《深入理解javascript原型和闭包系列》 知识点整理
- 2025-06-23 JS面试题突破:什么是闭包?(闭包 js)
- 2025-06-23 JavaScript闭包(javascript 闭包)
- 2025-06-23 “闭包到底是什么?90% 的前端开发者都没真正搞懂!”
- 2024-10-04 两个小案例让你深入理解 Javascript 闭包和作用域
- 2024-10-04 js中的闭包 js闭包的使用
你 发表评论:
欢迎- 558℃Oracle分析函数之Lag和Lead()使用
- 555℃几个Oracle空值处理函数 oracle处理null值的函数
- 544℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 540℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 538℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 529℃【数据统计分析】详解Oracle分组函数之CUBE
- 519℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 506℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端密码加密 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)