什么是闭包?
闭包就是能够读取其他函数内部变脸的函数。在 JavaScript 中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成「定义在一个函数内部的函数」。本质,闭包是将函数内部和函数外部连接起来的桥梁。
变量的作用域
要了解闭包,首先必须了解 JavaScript 特殊的变量作用域。
- 全局变量
- 局部变量
1 | var a = 12345; // 全局变量 |
但是在函数外部自然不能读取函数内部的变量。
1 | function f1(){ |
在函数内部声明变量的时候,一定要使用 var,如果不使用,实际上你生命了一个全局变量
1 | function f1(){ |
如何从外部读取局部变脸?
在函数内部,在定义一个函数
1 | function f1(){ |
在代码中,函数 f2 就被包含在函数 f1 内部,这是 f1 内部的所有全局变量,对 f2 都是可见的。但是反过来不行,f2 内部的局部变量,对 f1 是不可见的。只能子对象一级以及网上寻找所有父对象的变量。
1 | function f1(){ |
如上面的代码所示,f2 函数就是闭包。
闭包的用途
闭包主要的在
- 可以读取函数内部的变量
- 让这些变脸的值始终保持在内存中
1 | function f1(){ |
在上述代码中,res 实际上就是闭包 f2 函数。他一共运行了 2 次,第一次的值是 999,第二次的值是 1000。这证明了,函数 f1 中的局部变量 n 一直保持在内存中,并没有在 f1 调用后被自动清除。
f1 是 f2 的富含,而 f2 被赋予了一个全局变脸,这导致 f2 永远存在内存中,而 f2 的存在依赖于 f1,因此 f1 也必须始终存在于内存中,不会在调用结束后,被垃圾回收机制回收。
值得注意
1 | nAdd = function(){ |
首先,在 nAdd 前面没有加var,因此 nAdd 是一个全局变量,而不是局部棉量,其次 nAdd 的值是一个匿名函数,而这个匿名函数本身也是个闭包,所以 nAdd 相当于是一个 setter,可以在函数外部对内部的局部变量进行操作。
注意! 「onAdd」这种函数写法,在严格模式(’use strict’)下是会报错的。
使用闭包的注意点
- 由于闭包会使得函数的变量都被保存在内存中,内存消耗是很严重的,所以不能滥用闭包,否则会造成网页的性能问题,在 IE 中会导致内存泄漏。解决方法是,在退出函数前,将不使用的局部变量全部删除
- 闭包会在函数外部,改变父函数的内部变量的值。所以,如果你把父函数当做对象使用,把闭包当做他的公用方法,把内部变量当做他的私有属性,必须注意,不能随便改变父函数内部变量的值。
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
好了写完了
再说点?
今天整理完,感觉还有一些时间,分享下上周看的奥斯卡最佳影片「绿皮书」
特别喜欢这句对白
「如果我不够黑人,也不够白人,又或不够男人,那请你告诉我,托尼,那我到底算是什么人!?」
从学校踏入社会,也有快三年时间了,接触的人也越来越多。在我三观里,对于男女平权、种族仇恨等等,都比较模糊,我只是一直觉得人不可能存在在中立阶段,更多可能是偏左、右,不管从自然选择、和平演变,我觉得大多数人类更多站在自己的利益面发表自己的言论。
在我看来,这部电影给我最大的思考就就是 Don Shirley 在雨中对 Tony 的歇斯底里的怒吼,为什么人活着就要偏向人群所希望亦或一致认知的生活状态。乃至已经到了 Don 这种高度学历、地位、教育的人依旧困在自己的思想桎梏。
我经常告诉自己「可能你改不了世界的现状,也改不了身边的朋友、亲人的环境,至少在自己认知方面觉得可以坚持的事,认真坚持到底。」乃至可能也不够「黑」、不够「白」。