什么是闭包?
闭包是一种环境,闭包适用于函数。
闭包的概念:指有权访问另一个函数作用域中变量的函数。
更好的理解:javascript中的变量分为两种,全局变量和局部变量。而闭包,就是让一些局部变量达到全局变量的使用效果。
举个例子👇

(图一)
在上面的例子里面,children函数访问到了parent函数里面的变量。parent就是一个闭包函数。
而这种在一个函数內部创建另一个函数,是闭包最常用的使用方式。
闭包的作用:实现变量私有化。
也就是说。有某一个变量。我需要使用到,但我不想让这个变量占用公共变量的位置也不能在函数内部去声明。
比如(图一)中的parent_number变量,parent_number被声明在父函数中,子函数访问父函数的变量,我们执行了parent函数,但是主要代码写在children函数中
注意:parent只有一个保存的变量的作用。这样,children函数就可以访问自己本身以外的一个变量却又不需要将这个变量放在公共变量中。到这里children就实现了变量的私有化。
闭包使用场景
我个人所使用闭包最多的地方。就在函数防抖和函数节流的时候。
闭包的另一个使用场景:循环点击 举个例子👇

分别点击5个div会逐级输出0,1,2,3,4吗?
答案是否定的!
onclick只有在被点击的时候才会执行,上面代码中,点击div输出 i,但是!这个时候i的五次循环以及结束了。所以。不论点击哪个div,都只会输出4

如何解决这个问题?
使用闭包,实现变量私有化
例如 👇

在每次循环的时候,立马执行,将变量保存在事件之中。这样点击的时候就不会引用到以及循环完毕的i。
闭包的优点: 1.减少公共变量,让代码更清晰可读。而且减少公共变量对于脚本来说也更安全。
闭包的缺点: 1.在低版本的IE浏览器中,被私有化的变量需要手动清除内存,否则会造成内存泄漏。 2.闭包本身因为在使用过程中被私有化的变量不被销毁,这一特性也注定了闭包会更消耗内存。
个人建议:如果不是在特殊的情况下,请尽量不要使用闭包。毕竟闭包对脚本本身就存在一定的负面影响,比如内存消耗和处理速度。
总结
- 闭包的概念:有权访问另一个函数中的变量
- 闭包的建议:少用,除非情况特殊,否则最好别用
- 闭包的场景:循环点击,函数防抖,函数节流等一些需要实现变量私有化的时候
- 闭包的优点:可读,不用大量的使用全局变量导致代码混乱
- 闭包的缺点:被私有化的变量不能被销毁,增加了内存的负担,造成内存泄露。解决方案是在使用之后手赋值为null
欢迎技术了解~
备注来自掘金~