一、作用
1、数据私有。解决同名后导致换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题
2、产生作用域链
3、延长变量的生命周期。当产生闭包后,闭包函数依赖的数据就会被保存在内存中,并且不会被垃圾回收机制回收
二、产生方式
内层函数去访问外层函数中的数据就会产生闭包
三、缺点
容易导致内存泄露
四、对于网上流传闭包作用的个人理解(望指正)
(一)数据私有
我看好多视频都说是解决在全局作用域中定义数据,函数内部依赖这个数据,再外面修改了这个数据导致影响函数内的数据的问题,但是你再全局作用域中修改肯定是出于某种目的,那这个数据就只能放在外面,因为放在里面修改不了,如果是同名的问题,let 关键字也会报错,重新取个名字就好,不需在弄个闭包这么麻烦,所以最主要的目的我觉得还是是同名,因为同名会导致你换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题,我觉的数据私有主要还是解决这个问题,而不是防止外层修改内层的数据
(二)内层函数可以访问外层函数中的变量
这其实不是闭包的作用,而是闭包产生了作用域链,是作用域链的作用
你的理解基本上都没有问题,对于“防止全局作用域中的数据被修改”的问题,这是闭包的一个用法,但不是它的主要的想达到目的。闭包确实会产生作用域链,这是因为闭包函数可以访问它的父函数的作用域。这也是 JS 的作用域链的特性,不仅是闭包的特性。你可以理解为,闭包是利用了 JS 的作用域链特性