网站首页 > 技术文章 正文
今天是清明小长假的第一天,先祝大家有个愉快的假期。就在昨天,士心看到了一句让士心受到一万点暴击的话:如果愚人节都没有人给你表白的话,注定孤独终老。。。果然人丑就该多读书,士心还是老老实实地学习前端好了,虐狗这种事情看来是与我无缘了。老规矩,我们先来回顾一下上集的内容,上一集我们学到了什么是面向对象,面象对象和面象过程的有什么区别,以及如何封装一个对象。
今天,我们来一起学习学习闭包吧。闭包是JavaScript中的一个重点,也是一个难点,很多高级应用都要依靠闭包实现。最重要的是,在前端面试中十家有八家都会问到闭包的问题。士心面试的时候就被闭包虐了无数次,面试官们总是喜欢换着花样通过闭包来虐求职者,真怀疑是不是面试官都有一点虐待倾向。不过面试官们既然出招了,咱们也不能怂不是,大家都是两个眼睛一个鼻子,who怕who。来,这就开干。。。
一,什么是闭包?
要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。先上几段非常简单的代码来理解一下变量的作用域;
但是我们有时候又需要得到函数内的局部变量,这要怎么办呢?很简单,我们可以在函数的内部,再定义一个函数。就像下面这样:
函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!继续上代码:
这段代码中的函数 f2 就是一个最简单的闭包了,那到底什么是闭包,闭包的定义又是什么呢?其实,简单来说,闭包就是有权访问另一个函数作用域中变量的函数,就是将函数内部和函数外部连接起来的一座桥梁。闭包是什么我们了解了,那闭包有什么用呢?闭包用处有很多,它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。让变量绐终保持在内存中,怎么理解这句话呢?这里就要涉及到JavaScript的垃圾回收机制了,什么是垃圾回收机制呢?当一个变量没有被任何对象所引用的时候,JavaScript就会把它回收以释放它占用的内存,举个例子,就像是前一集中了5000万的土豪士心,一夜暴富后不停地买买买,结果家里一下子多了很多无用的包装盒,这时候家政漂亮小妹看到了,心想这些包装盒又没用又占用家里的空间,于是漂亮小妹就把这些包装盒拿出去给扔了。这就是垃圾回收机制了。说了这么多,一起来做一道面试题 感 受一下
士心第一眼看到这道题的时候内心是崩溃的,好乱的感觉有没有。但是一步一步来分析,你会发现其实也不是太难,先来看看 a = fun(0);这里在控制台输出undefind,大家应该都懂,因为o没有定义。接下来,因为a指向了fun(0)返回的对象,也就是
所以,a.fun(1)则是在执行fun(0)返回的对象中的fun方法,而fun方法又执行了一次f(m,n)这个方法,这个时候,闭包表现的机会来了,m的值是1,这个没问题 ,那么n呢,n的值是多少?我们前面学到了闭包的一大作用就是让变量的值始终保持在内存中,由于对象 a 一直保持着对变量 n 的引用,所以 n 并不会被垃圾回收机制释放,所以 n 的值就是我们一开始值行 fun(0) 传入的值 0;于是,a.fun(1) 相当于是执行了 fun(1,0), 所以a.fun(1)在控制台打印的结果就是:0,后面的a.fun(2)和a.fun(3)也是同样的道理,所以,第一行调用输出的结果就是:undefind 0 0 0,后面的b , c就算是小小的思考题 吧,只要注意 n 的值的变化,一定难不倒头条聪明的小伙伴们的。其实闭包相关的知识还有很多,比如闭包中this指向的问题 ,这也是面试中的一大考点。还有使用闭包有什么优缺点,在具体项目中使用闭包来做什么,这些问题我们在以后的学习都会遇到。其实士心个人觉得,闭包更重要的是一种思想,一种写代码的风格,既然是思想,是风格,就需要在更多的项目实战中去体会,去打磨,这样对闭包的理解会更加地深刻,而不能一口气吃成一个大胖子。
好了,今天先学习到这里吧,最后再说一点题 外话吧,前两天看到有小伙伴留言问前两集的老G哪去了,感谢这位小伙伴的提醒,其实士心也一直在想这个问题 ,士心发文的定位好像突然从一个学习者变成了教授者,这并不是士心的初衷。当初士心申请头条号的时候,一是想在工作之余,有机会增加一点额外的收入,同时士心也明白,相比于视频,娱乐类动辄百万,千万的阅读量,技术类的受众面毕竟要小很多,士心有自知之明,心想就算不能赚取工作外额外的收入,能够巩固基础知识和学习新的前端知识也是极好的,对日常的工作也很是有帮助的。所以士心一直是抱着一个学习者的心态和大家一起学习的,这两天的发文定位确实有点跑偏了,在发完面向对像这一集之后,士心会找准定位,重新变回那个小白士心,学生士心,然后内容中有什么错误也欢迎小伙伴们批评指正,谢谢大家!
猜你喜欢
- 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闭包的使用
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 561℃Oracle分析函数之Lag和Lead()使用
- 556℃几个Oracle空值处理函数 oracle处理null值的函数
- 546℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 542℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 539℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 531℃【数据统计分析】详解Oracle分组函数之CUBE
- 519℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 510℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)