有时候在查一个知识点的时候,如果你只看了一篇文章,恰巧那篇文章讲的并不准确,可能你一辈子都要认为的有偏差了。
闭包首先要从内存管理说起
不管现代浏览器做的再好,我们总会在上一些网站时发现很卡,卡的原因可能千千万吧,但是如果因为代码质量问题占内存了,那就是我们做开发的不好了。
首先我们要了解内存生命周期
不管什么程序语言,内存生命周期基本是一致的
分配你所需要的内存
使用分配到的内存(读、写)
不需要时将其释放\归还
在所有语言中第一和第二部分都很清晰。最后一步在低级语言中很清晰,但是在像JavaScript 等高级语言中,这一步是隐藏的、透明的。
这里说到JavaScript最后一步是隐藏的,也就是我们常听到的垃圾回收机制。这边可以还抛出几个问题“垃圾回收机制何时触发?垃圾回收机制回收了哪些东西?”
闭包的产生
可以看一下上图的例子,这是一个闭包。为什么说这是一个闭包呢?因为我们可以看到,myFunc 在这里 myFunc = function displayName。通常情况下,若不产生闭包,我们理解中,name 是一个私有变量,运行makeFunc方法后,name会从内存中释放。而此处,因为产生了闭包,name并没有被释放,所以在运行 myFunc 后 可以打印出name 值。
通俗的说,闭包就是方法A里面写方法B,B里面引用了A中的变量C。当运行A后,C依旧存在内存中。
我们再看下面这段代码
这段代码中是否产生了闭包?“是的”
但是这段代码中 name 被回收了吗?“是的”
我们可以看到,在myFunc中定义了一个私有变量,这个变量 tMyFunc = function displayName。这里我们引用到了name的值。但我们知道,在运行myFunc完毕时。私有变量tMyFunc也会被释放了,从而name也被回收了
我们在写代码的时候,要注意,有些时候或许可能需要用到闭包,但用到闭包时必须要注意内存的释放。
ps:早睡早起,常做运动,多与异性交朋友~