都2020年了,你还不懂什么是闭包吗---深入理解闭包这一篇文章足以

简介: 都2020年了,你还不懂什么是闭包吗---深入理解闭包这一篇文章足以

前言

      闭包(closure)是 JavasSript 的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。每个前端工程师都应该能够对闭包的原理烂熟于心,看完这篇文章,相信同学们对闭包一定会有更深的理解

正文

什么是闭包?

      闭包是指有权访问另一个函数作用域中的变量的函数,因为javaScript有一个特别之处,子对象只会一级一级向上查找搜索父对象的变量,也就是说子对象可以访问父对象的变量,但是父对象不可以访问子对象的变量。所以,如果你希望访问一个函数的作用域,你只能在它的作用域下访问,或者在这个函数的作用域下再定义一个函数,这也就是“闭包”

640.png


么要用闭包

      闭包可以用在许多地方。它的最大用处有两个,一个是上一小节提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在 父类调用后被自动清除。一般来说,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域。但是闭包的情况有所不同。

在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域中,所以即使闭包的函数执行完毕以后,它的作用域链仍然在引用这个活动对象,所以它的活动对象仍然会留在内存中。由于闭包会携带包含它的函数的作用域,也因此会占用更多的内存


匿名函数与闭包的区别

      很多同学在初学前端的时候可能分不清匿名函数和闭包,其实这两者的确半毛钱关系都没有。匿名函数就是没有名字的function,常用于自执行函数,而闭包是指有权访问函数作用域中的变量的函数。匿名函数可用于实现闭包。

640.png

      但是上面这个例子并不能说明匿名和闭包有啥关系,只能说明匿名可以用于

实现闭包,仅此而已,闭包机制适用于所有的javaScript函数,无论是否是匿名的


闭包中的变量问题

      闭包的作用链机制引出了一个副作用,闭包只能取得包含函数中任何变量的最后一个值,因为闭包所保存的是整个变量对象,而不是某个特殊变量

640.png

     这个函数会返回一个函数数组,每个函数的返回值都是10,而不是位置0返回0,位置1返回1,因为这些函数都是闭包的函数,作用域链中保存着createFunctions()函数的活动对象,所以它们引用的都是一个值,也就是10

640.png


内存泄露

      如果闭包的作用域中保存着一个HTML元素,那么就意味着改元素无法被销毁,因为这个HTML元素的引用一直存在,闭包就不会回收,即使执行完毕。

640.png

       所以有必要把ele变量设置为null,就可以解除引用。顺利减少其引用数,确保正常回收其站的内存


小结

      1、在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。

      2、当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

      小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!

目录
相关文章
|
10月前
什么是闭包,闭包的特性
什么是闭包,闭包的特性
|
5天前
|
JavaScript 前端开发
经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!
经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!
|
3天前
|
存储 JavaScript 前端开发
技术经验解读:什么是闭包?闭包的优缺点?
技术经验解读:什么是闭包?闭包的优缺点?
10 1
|
2月前
|
人工智能 自然语言处理 前端开发
闭包是什么?闭包的用途是什么?
闭包是什么?闭包的用途是什么?
|
Web App开发 JavaScript 前端开发
应该如何理解闭包
应该如何理解闭包
应该如何理解闭包
什么是闭包?闭包的用途是什么?闭包的缺点是什么?
变量的作用域有两种:全局变量和局部变量; 函数内部可以直接读取全局变量; 在函数外部无法读取函数内的局部变量。 能够读取其他函数内部变量的函数,就是闭包
96 0
|
自然语言处理 JavaScript 前端开发
每日一题:说说你对闭包的理解?闭包使用场景
每日一题:说说你对闭包的理解?闭包使用场景
97 0
|
自然语言处理
闭包的原理跟作用
闭包的原理跟作用
124 0
|
自然语言处理 JavaScript 前端开发
【闭包概念】关于闭包概念不同解读——你可以自己理解。
写在前面: 闭包是被讲烂的内容,但是当我不了解的情况下,看过很多教程,听过很多道理,还是无法完全理解闭包这个东西。所以想要写一篇比较详细,前端小白也能够真正理解闭包概念的干货文章,本文参考很多闭包资料,希望能真正把闭包这个东西讲清楚,喜欢的朋友可以点个赞,或者点波关注。 首先需要了解一波js变量的作用域以及变量的生存周期。 前几天我发在掘金上面了,下面是一个内容概要,墙裂推荐所有小伙伴,还是点进去学习一波,作用域这个问题可以说是闭包最为重要的内容。 里面的内容包括: 1.变量的作用域(变量的有效范围)。2.变量作用域,js高级程序设计(红宝书)中的解释。3.红宝书中的作用域链栗子(还有一个例子
140 0
【闭包概念】关于闭包概念不同解读——你可以自己理解。
|
存储 编译器 开发者
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
471 0
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包