1、闭包是啥??
- 闭包就是能够读取其他函数内部变量的函数,内层函数可以访问到外层函数的作用域;
- 简单的说:闭包就是函数嵌套函数;
2、闭包的 优点 && 缺点
- 优点:可以实现数据的私有化,外部函数也可以访问函数内部变量,避免全局变量的污染;
- 缺点:会造成内存泄漏;
- 内存泄漏就是函数执行返回一个引用数据类型被外界所接受,或者引入外部变量了,就会形成一个不销毁的作用域,一直存在内存里面,就会造成内存泄漏;
- 私有化就是函数形成了一个私有的作用域,保护内部的变量不受外界的干扰,适合模块化开发,经常会用在节流、防抖、函数柯里化,hooks,vue、生命周期源码都有闭包的引入;
3、那些操作会引起 泄漏
- 内存泄漏就是指任何对象我们不在用他或者不需要的时候他仍然存在,这样会引起泄漏;
- 比如:1、setTimeout(延迟定时器) 的第一个参数使用字符串不是函数的话,会引发内存泄漏;2、没有销毁的事件监听器,事件监听器是常见的内存泄漏源。当你在DOM元素上添加事件监听器时,如果不手动删除它们,它们将一直存在于内存中;3、循环引用是另一个常见的内存泄漏源。当两个或多个对象相互引用时,并且没有任何引用指向它们之中的任何一个时,它们将无法被垃圾回收。
4、解决闭包 缺点引起的 内存泄漏
- 避免循环引用:循环引用是指两个或多个对象之间相互引用,导致它们无法被垃圾回收。要避免循环引用,可以在不需要引用的时候手动断开引用关系,或者使用弱引用(Weak Reference)来解决。
- setTimeout(延迟定时器) 不在使用的时候及时清理掉;
5、防抖 && 节流 的区别
- 相同点:都是为了减少事件触发频率,优化性能;
- 都是用来去处理短时间内去,处理大量触发事件的一种处理方式,处理方式不同,
不同点
6、防抖
- 防抖是指在一段时间内只要有事件触发,就重新计算时间,直到这段时间内没有事件触发,才真正的执行事件;
- 防抖的应用场景: 用户在输入框连续输入一串字符时,可以通过防抖策略;搜索框搜索输入,并在输入完以后自动搜索、手机号,邮箱验证输入检测、窗口大小 resize 变化后,再重新渲染。
7、节流
- 节流是指在一段时间内最多触发一次事件,节流算法会在特定的时间间隔内判断是否触发事件;
- 节流策略的应用场景: 鼠标不断触发某事件时,如点击,只在单位事件内触发一次;滚动加载更多、搜索框搜的索联想功能、高频点击、表单重复提交
- 实现思路:我们会有一个节流阀,事件来了之后我会判断一下这个节流阀,如果节流阀是一个true,那我们就开启这个执行时间,同时把节流阀改为false,然后再开启一个定时器,一秒以后再把节流阀改为true
8、防抖的实现思路
-
先写一个函数,然后在内层再return写一个函数,在外层函数里定义一个 timer 定时器,
-
如果执行了这个定时器,那么在return返回的函数里先清除之前的定时器,然后再新加一个,
-
防抖就是每次一执行return这个函数,就要把之前的函数清掉,然后重新加一个定时器,
-
指定一个延迟时间,delay,fn
demo
// 防抖函数
function debounce(func, delay) {
let timer;
return function() {
// 清除之前的定时器
clearTimeout(timer);
// 创建新的定时器打包
timer = setTimeout(() => {
// 执行函数处理逻辑
func.apply(this, arguments);
}, delay);
};
}