您的位置:首页 > 其它

关于函数防抖和函数节流

2018-11-06 09:35 323 查看

函数防抖与节流是很相似的概念,但它们的应用场景不太一样。
函数防抖简单来说就像法师释放技能的读条,如果你在施法读条时重复选择释放技能,那么读条时间将重新计算。

  • 举个例子:
function debounce(func, delay) {
var timeout;
return function(e) {
console.log("清除",timeout,e.target.value)
clearTimeout(timeout);
var context = this, args = arguments
console.log("新的",timeout, e.target.value)
timeout = setTimeout(function(){
console.log("----")
func.apply(context, args);
},delay)
};
};

var validate = debounce(function(e) {
console.log("change", e.target.value, new Date-0)
}, 380);

// 绑定监听
document.querySelector("input").addEventListener('input', validate);

在一定的延迟内重复点击按钮,如果定时器已经开始执行,则清空定时器,重新开始计时,如果没有重复执行,则延迟若干时间后执行一次。

而函数节流,简单表达的话则是法师的技能只能在CD后再度释放,也就是说限制函数的使用频率,但是重复的触发事件一定能再次执行函数。
举个例子:捆绑在按钮上的抽奖事件,每当触发抽奖事件后的10秒内点击按钮均为无效,只能在10秒后的点击事件才能再度触发抽奖。

function throttle(fn, threshhold) {
var timeout
var start = new Date;
var threshhold = threshhold || 160
return function () {

var context = this, args = arguments, curr = new Date() - 0

clearTimeout(timeout)//总是干掉事件回调
if(curr - start >= threshhold){
console.log("now", curr, curr - start)//注意这里相减的结果,都差不多是160左右
fn.apply(context, args) //只执行一部分方法,这些方法是在某个时间段内执行一次
start = curr
}else{
//让方法在脱离事件后也能执行一次
timeout = setTimeout(function(){
fn.apply(context, args)
}, threshhold);
}
}
}
var mousemove = throttle(function(e) {
console.log(e.pageX, e.pageY)
});

// 绑定监听
document.querySelector("#panel").addEventListener('mousemove', mousemove);

函数节流和函数防抖的对比。

**函数防抖:**如果不断重复函数节流,如果触发频率高于防抖限制,则函数防抖会不断重置定时器,事件永远不会被触发。

**函数节流:**如果不断重复触发函数节流,函数会根据设定限制函数的执行频率。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: