1.什么是闭包
首先理解JavaScript的作用域——全局作用域和局部作用域(先不考虑块级作用域)。
- 在全局作用域下声明的变量就是全局变量
- 在局部作用域下声明的变量就是局部变量。
因为作用域链的存在,函数内部可以直接读取全局变量。而函数内部无法读取函数内部的局部变量。
闭包就是在一个函数内部创建另一个函数,让你可以在一个内层函数中访问到其外层函数的作用域。又或者说,闭包就是能够读取其他函数内部变量的函数。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
但闭包的用途可不止是读取函数内部的变量,它可以函数变量保存在内存中,不会被垃圾回收机制回收。
2.闭包的优点和缺点
优点:闭包因为长期驻扎在内存中。可以重复使用变量,不会造成变量污染
缺点:闭包会使函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,可能会导致内存泄露。解决方法是在退出函数之前,将不使用的变量全部删除
内存泄漏:某些变量、函数等不再需要占用内存的时候,由于某些原因,内存没有被回收。
3.闭包的使用场景