闭包,顾名思义就是一个封闭的包裹,你没办法窥探到其内部,只能通过暴露给你的方法进行操作。其实在写代码的过程中,我们可能已经使用了闭包,只是当时不知道而已。等理解了闭包,再去回顾以前的代码,就会发现JavaScript中闭包无处不在。
刚开始学习闭包的时候,我看过很多关于闭包的文章,大部分都会举例这样一段代码:
执行函数Foo(),将函数内部的方法bar作为返回值,赋值给变量fn,这样在外部就可以直接访问函数内的变量。看下面这段代码:
将内部函数bar的引用传递给一个全局变量fn。
当函数Foo()执行完毕后,Foo()的内容不会再被使用,根据javascript的垃圾回收机制,函数的内存空间将会被回收,但是因为bar()在函数外部被执行,而且bar可以访问函数内部的所有变量,所以函数的内存空间不会被回收。
所以无论通过哪种方式将内部函数传递到它所在的作用域之外,而它对于自身定义时的作用域始终有访问的权限,这就形成了闭包,所以无论在什么地方执行这个内部函数都会用到闭包。
现在来说一下闭包与循环:
很多人会以为这段代码的输出结果是:0 1 2 3 4,其实就算将代码修改为setTimeout(....,0),结果也是:5 5 5 5 5。
因为这些回调函数是在循环结束之后才开始执行,而他们共享全局作用域中的变量i,所以在它们执行的时候所访问到的i=5;对这段代码进行修改:
使用立即执行函数创建一个独立的作用域,并将作用域封闭在每一个回调函数中,使其拥有正确的变量i的引用。
闭包与模块:
这种模式在javascript中被称为模块,Person是一个函数,通过调用它来创建内部作用域和闭包,它返回的是一个对象(不一定要返回对象,也可以只返回内部方法),该对象被赋值给全局变量p,对象中的值是对函数内部方法的引用。通过p可以访问函数内部的数据变量和方法。
参考资料:
1.YOU DON"T KNOW JS,KYLE SIMPSON
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87069.html
摘要:上图中,每个红圈表示一个请求,每一层的请求分别是上一层请求的子请求。换而言之,父请求是依赖于子请求的。特别地,的子请求运行时,会阻塞父请求挂起其对应的协程。 张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护。Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的研究;曾为 ngx_lua 贡...
摘要:接下来就来说下我眼中的。链表转换为树的阈值,超过这个长度的链表会被转换为红黑树,当然,不止这一个条件,在下面的源码部分会看到。 源码部分从HashMap说起是因为笔者看了很多遍这个类的源码部分,同时感觉网上很多都是粗略的介绍,有些可能还不正确,最后只能自己看源码来验证理解,写下这篇文章一方面是为了促使自己能深入,另一方面也是给一些新人一些指导,不求有功,但求无过。有错误的地方请在评论中...
摘要:前言函数式编程在前端已经成为了一个非常热门的话题。整个过程就是体现了函数式编程的核心思想通过函数对数据进行转换。高阶函数函数式编程倾向于复用一组通用的函数功能来处理数据,它通过使用高阶函数来实现。 前言 函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。 本文将略去那些晦涩难懂的概念介绍,重点展示在 JavaScrip...
摘要:出品滴滴技术作者陶文技术同学的主要工作是构建一个可运行的去解决用户的一个。陶文滴滴首席工程师在滴滴参与过基础架构,核心出行平台重构,业务中台建设等工作,目前在从事平台治理和客服系统,致力于减少大家出行中遇到的不美好。 出品 | 滴滴技术作者 | 陶文 showImg(https://segmentfault.com/img/bVbs78V?w=1280&h=544); 技术同学的主要工...
阅读 725·2021-10-14 09:43
阅读 2045·2021-09-30 09:48
阅读 3417·2021-09-08 09:45
阅读 1072·2021-09-02 15:41
阅读 1857·2021-08-26 14:15
阅读 743·2021-08-03 14:04
阅读 2930·2019-08-30 15:56
阅读 3052·2019-08-30 15:52