关于【闭包】的个人理解,如果有误请指正?

一、作用

1、数据私有。解决同名后导致换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题
2、产生作用域链
3、延长变量的生命周期。当产生闭包后,闭包函数依赖的数据就会被保存在内存中,并且不会被垃圾回收机制回收

二、产生方式

内层函数去访问外层函数中的数据就会产生闭包

三、缺点

容易导致内存泄露

四、对于网上流传闭包作用的个人理解(望指正)
(一)数据私有
我看好多视频都说是解决在全局作用域中定义数据,函数内部依赖这个数据,再外面修改了这个数据导致影响函数内的数据的问题,但是你再全局作用域中修改肯定是出于某种目的,那这个数据就只能放在外面,因为放在里面修改不了,如果是同名的问题,let 关键字也会报错,重新取个名字就好,不需在弄个闭包这么麻烦,所以最主要的目的我觉得还是是同名,因为同名会导致你换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题,我觉的数据私有主要还是解决这个问题,而不是防止外层修改内层的数据

(二)内层函数可以访问外层函数中的变量
这其实不是闭包的作用,而是闭包产生了作用域链,是作用域链的作用

阅读 1.7k
3 个回答

你的理解基本上都没有问题,对于“防止全局作用域中的数据被修改”的问题,这是闭包的一个用法,但不是它的主要的想达到目的。闭包确实会产生作用域链,这是因为闭包函数可以访问它的父函数的作用域。这也是 JS 的作用域链的特性,不仅是闭包的特性。你可以理解为,闭包是利用了 JS 的作用域链特性

闭包是基于某个目标设计出来的概念,不是某些特性组合产生的现象,所以闭包不需要理解,闭包需要记忆。对所有的同学都一样,不要看一些乱七八槽的文章,然后配合自己的经验,视图去理解;去找经典文章,认真看仔细看,然后把里面的概念记住。

比如:MDN 闭包

至于缺点和作用,只要你能记住、记全那些概念,很容易就可以推导出来。

类似的点还有很多,比如 event loop,好好看经典文章,好好记。

推荐问题
宣传栏