什么是闭包?
闭包是指有权访问另外一个函数作用域中的变量的函数。
闭包形成的必要条件:
- 函数嵌套
- 内部函数使用外部函数的变量
- 内部函数作为返回值
举个栗子:实现每隔1s递增打印数字
- 使用闭包实现
for(var i=1; i<=5; i++) { (function(i) { setTimeout(() => { console.log(i); }, i*1000); })(i); }
- 使用 let 块级作用域
for(let i=1; i<=5; i++) { setTimeout(() => { console.log(i); }, i*1000) }
闭包优点
- 保护:保护变量的安全,实现 js 私有属性和私有方法,防止变量污染
利用闭包可以读取函数内部的变量,变量在函数外部不能直接读取到,从而达到保护变量安全的作用。因为私有方法在函数内部都能被访问到,从而实现了私有属性和方法的共享。
- 保存:如果上下文不被销毁,那么存储的私有变量的值也不会被销毁,可以被其下级上下文中调取使用(将处理结果缓存,供下次使用)
闭包缺点
- 闭包内申明的变量不能被垃圾回收,会增加内存消耗,在IE下容易造成内存泄露内存泄露
https://blog.csdn.net/m0_73531461/article/details/136842249?spm=1001.2014.3001.5502
- 比普通函数更占用内存,会导致网页性能变差。
闭包的应用场景
- 封装功能时(需要使用私有的属性和方法)
- 函数防抖、函数节流
函数防抖、函数节流
https://blog.csdn.net/m0_73531461/article/details/136846161?spm=1001.2014.3001.5502
- 函数柯里化「前端进阶」彻底弄懂函数柯里化
https://juejin.cn/post/6844903882208837645
- 给元素伪数组添加事件需要使用元素的索引值
// DOM操作 let li = document.querySelectorAll('li'); for(var i = 0; i < li.length; i++) { (function(i){ li[i].onclick = function() { alert(i); } })(i) }