希望是通俗易懂的谈一下JS 闭包问题

1,368 阅读2分钟

有时候在查一个知识点的时候,如果你只看了一篇文章,恰巧那篇文章讲的并不准确,可能你一辈子都要认为的有偏差了。


 闭包首先要从内存管理说起 

不管现代浏览器做的再好,我们总会在上一些网站时发现很卡,卡的原因可能千千万吧,但是如果因为代码质量问题占内存了,那就是我们做开发的不好了。

首先我们要了解内存生命周期

不管什么程序语言,内存生命周期基本是一致的

  1. 分配你所需要的内存

  2. 使用分配到的内存(读、写)

  3. 不需要时将其释放\归还

在所有语言中第一和第二部分都很清晰。最后一步在低级语言中很清晰,但是在像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:早睡早起,常做运动,多与异性交朋友~