let timer
//当前的this是指向window
return function (...args) {
//当前的this是指向dom元素
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() =>{
func.apply(this, args)
}, delay)
}
}
例:<div id="test">点击</div>
实现隔3s执行一次的操作:
document.getElementById('test').addEventListener('click', debounce(function() {
console.log('执行完成之后的动作')
}, 3000))
记:事件回调函数里的this指向触发当前事件的DOM元素
函数防抖 ( debounce ):
含义:延迟函数执行 ; 用处:多用于input框输入时,显示匹配的输入内容。(n秒后延迟执行)
函数节流(throttle):
含义:单位时间内,只执行第一次触发,之后的时间内都不执行,知道单位时间结束。 (立即执行,n秒后在立即执行)
用处:防止按钮重复点击,页面滚动,窗口resize等。
两者的区别:函数节流是减少函数的触发频率,而函数防抖则是延迟函数执行,并且不管触发多少次都只执行最后一次。
<举个栗子><举个栗子><举个栗子>
防抖和节流函数一般都是封装在公用的js中使用:
utils.js:
/*函数节流*/
function throttle(fn, interval) {
var enterTime = 0//触发的时间
var gapTime = interval || 300 //间隔时间,如果interval不传,则默认300ms
return function() {
var context = this
var backTime = new Date()//第一次函数return即触发的时间
if (backTime - enterTime >gapTime) {
fn.call(context,arguments)
enterTime = backTime//赋值给第一次触发的时间,这样就保存了第二次触发的时间
}
}
}
/*函数防抖*/
function debounce(fn, interval) {
var timer
var gapTime = interval || 1000//间隔时间,如果interval不传,则默认1000ms
return function() {
clearTimeout(timer)
var context = this
var args = arguments//保存此处的arguments,因为setTimeout是全局的,arguments不是防抖函数需要的。
timer = setTimeout(function() {
fn.call(context,args)
}, gapTime)
}
}
export default {
throttle,
debounce
}
index.vue:
import tool from "../../static/js/utils.js"
Page({
data:{
win_scrollTop:0
},
onPageScroll: tool.throttle(function(msg){
//执行函数
}),
gotoUnlock: tool.debounce(function() {
//执行函数
}),
})
原文链接: https://www.cnblogs.com/zjjDaily/p/10840276.html