欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于函数防抖和函数节流

程序员文章站 2022-05-14 16:25:35
...

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

  • 举个例子:
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);

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

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

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

相关标签: 节流和防抖