网站开发人员保密,建网站做优化,有做兼职的网站吗,crm客户端一、防抖和节流主要是干什么的
防抖和节流主要用于控制函数执行的频率#xff0c;通过限制函数的触发次数#xff0c;避免函数被过度调用而引发的性能问题或产生不必要的副作用。
二、防抖
防抖是什么:
1、对于在事件被触发 n 秒后再执行的回调 -- 延迟执行
2、如果…一、防抖和节流主要是干什么的
防抖和节流主要用于控制函数执行的频率通过限制函数的触发次数避免函数被过度调用而引发的性能问题或产生不必要的副作用。
二、防抖
防抖是什么:
1、对于在事件被触发 n 秒后再执行的回调 -- 延迟执行
2、如果在这 n 秒内再次触发事件重新开始计时
防抖的场景:
1、ajax 请求数据 / 提交数据下拉刷新
2、输入验证
注意防抖有两种场景一种是上来就要执行一次一种是在规定的时间后去执行
具体实现
// 第一种写法:普通写法
// 在执行事件之后不会立即执行而是等到定时器时间结束之后才开始执行
/*** * param {*} func 需要执行的函数* param {*} delay 延迟执行的时间* returns */
function debounce(func, delay) {let timer nullreturn function() {clearTimeout(timer)var self thisargu argumentstimer setTimeout(function() {func.apply(self, argu)}, delay);}
}
/*** 使用 setTimeout 实现防抖。* 在函数被调用时清除之前设置的定时器。* 在延迟时间内连续调用函数时会不断清除之前的定时器并重新设置新的定时器确保只有在最后一次调用后的延迟时间结束后才会执行函数。* 通过闭包保存定时器变量确保每次调用都使用同一个定时器。* 优点是简单易懂缺点是无法立即触发函数只有在延迟时间结束后才会执行函数。*/// 用来测试的方法
function test() {console.log(测试防抖);
}
// 获取到页面的 dom 节点
let de document.querySelector(.testDebounce);
// 使用第一种方法实现防抖
de.addEventListener(click, debounce(test, 2000))// 第二种写法:包含是否立即执行
// 在执行事件之后会立即执行一次剩下的时候就是会在定时器结束才会继续执行
/*** * param {*} func 需要执行的函数 * param {*} delay 延迟执行的时间* param {*} triggleNow 是否立即执行 -- 布尔值* returns */
function debounce(func, delay, triggleNow) {var timer nullvar debounced function() {var self thisvar argu argumentsif (timer) {clearTimeout(timer)}if (triggleNow) {var noTimer !timertimer setTimeout(function() {timer null}, delay)if (noTimer) {func.apply(self, argu)}} else {timer setTimeout(function() {func.apply(self, argu)}, delay)}}debounced.remove function() {clearTimeout(timer)timer null}return debounced
}
/*** 使用计时器和闭包实现防抖。* 在函数被调用时清除之前设置的定时器。* 如果设置了 triggleNow 参数为 true则在函数第一次被调用时立即执行函数之后的连续调用会在延迟时间结束后才能再次触发函数。* 如果没有设置 triggleNow 或设置为 false则在延迟时间结束后执行函数。* 通过闭包保存定时器变量和函数执行状态确保只有符合条件的调用才能触发函数。* 通过 debounced.remove 方法可以手动移除定时器取消防抖效果。* 优点是灵活性高可以设置立即触发和手动移除定时器缺点是稍显复杂。*/// 用来测试的方法
function test() {console.log(测试防抖);
}
// 获取到页面的 dom 节点
let de document.querySelector(.testDebounce);
// 使用第二种方法实现防抖
de.addEventListener(click, debounce(test, 2000, true))
三、节流
节流是什么:
1、事件被触发n 秒之内只执行一次事件处理函数
2、无论在这段时间内触发了多少次函数调用只会执行一次
节流的场景:
1、输入验证验证长度等
2、ajax 提交
具体实现
// 第一种写法:
// 通过一个变量来判断当前函数的执行状态形成闭包
/*** * param {*} func 需要执行的函数* param {*} delay 延迟执行的时间* returns */
function throttle1(func, delay) {let timer nulllet shouldExecute truereturn function(...args) {if (!shouldExecute) {return}shouldExecute falsetimer setTimeout(function() {func.apply(this, args)shouldExecute true}, delay)}
}
/*** 具体实现流程:* 使用 setTimeout 实现节流。* 在函数被调用时设置一个延迟定时器并在延迟时间结束后执行函数。* 通过一个标志位 shouldExecute 控制是否执行函数在延迟时间内连续调用函数只会执行一次。* 一旦函数执行完毕将 shouldExecute 设置为 true表示可以再次执行函数。* 优点是延迟时间可以精确控制缺点是在延迟时间内的连续函数调用会被忽略。*/// 用来测试的方法
function test() {console.log(节流数据);
}
// 获取到页面的 dom 节点
let tt document.querySelector(.testThrottle)// 使用第一种方法实现节流
tt.addEventListener(click, throttle1(test, 2000))
// 第二种写法:
// 通过两个时间戳来判断当前函数的执行状态也会形成闭包
/*** * param {*} func 需要执行的函数* param {*} delay 延迟执行的时间* returns */
function throttle2(func, delay) {let timer nulllet begin new Date().getTime()return function() {let self thislet argu argumentslet current new Date().getTime()clearTimeout(timer)if (current - begin delay) {func.apply(self, argu)begin current} else {timer setTimeout(function() {func.apply(self, argu)}, delay)}}
}
/*** 具体实现流程:* 使用计时器和时间戳实现节流。* 在函数被调用时记录当前时间戳 current。* 如果当前时间戳距离上一次调用时间戳 begin 大于等于设定的延迟时间 delay则立即执行函数并更新 begin 的值为当前时间戳。* 如果当前时间戳距离上一次调用时间戳 begin 小于延迟时间 delay则设置一个延迟定时器在延迟时间结束后执行函数。* 优点是在延迟时间内的连续函数调用不会被忽略缺点是延迟时间不是精确的而是最小延迟时间和连续函数调用之间的时间差*/// 用来测试的方法
function test() {console.log(节流数据);
}
// 获取到页面的 dom 节点
let tt document.querySelector(.testThrottle)// 使用第二种方法实现节流
tt.addEventListener(click, throttle2(test, 2000))
总结
防抖和节流都能够优化函数执行频率提升性能控制事件触发频率优化用户输入实现平滑动画等。在需要控制函数执行频率以避免资源浪费、提高交互体验或优化动画效果的场景中防抖和节流都是非常有用的技术手段
如果还是不太能理解他俩的区别之前我在一个评论区看到一个神评“防抖就是回城节流就是放技能”相信看到这句话就能通俗易懂的理解他俩之间的区别了。