资讯专栏INFORMATION COLUMN

2019.04.04 防抖和节流

SegmentFault / 489人阅读

摘要:只记录简单实现方法用以明白原理防抖,去抖动。周期结束后,又有事件触发,开始新的周期。节流策略也分前缘和延迟两种。简单版定时器期间,只执行最后一次操作

只记录简单实现方法、用以明白原理

防抖

debounce,去抖动。策略是当事件被触发时,设定一个周期延迟执行动作,若期间又被触发,则重新设定周期,直到周期结束,执行动作。 这是debounce的基本思想,在后期又扩展了前缘debounce,即执行动作在前,然后设定周期,周期内有事件被触发,不执行动作,且周期重新设定
// 暴力版: 定时器期间,有新操作时,清空旧定时器,重设新定时器
var debounce = (fn, wait) => {
    let timer, timeStamp=0;
    let context, args;
 
    let run = ()=>{
        timer= setTimeout(()=>{
            fn.apply(context,args);
        },wait);
    }
    let clean = () => {
        clearTimeout(timer);
    }
 
    return function(){
        context=this;
        args=arguments;
        let now = (new Date()).getTime();
 
        if(now-timeStamp < wait){
            console.log("reset",now);
            clean();  // clear running timer 
            run();    // reset new timer from current time
        }else{
            console.log("set",now);
            run();    // last timer alreay executed, set a new timer
        }
        timeStamp=now;
 
    }
 
}
节流

throttling,节流的策略是,固定周期内,只执行一次动作,若有新事件触发,不执行。周期结束后,又有事件触发,开始新的周期。 节流策略也分前缘和延迟两种。与debounce类似,延迟是指 周期结束后执行动作,前缘是指执行动作后再开始周期。
// 简单版: 定时器期间,只执行最后一次操作
var throttling = (fn, wait) => {
    let timer;
    let context, args;
 
    let run = () => {
        timer=setTimeout(()=>{
            fn.apply(context,args);
            clearTimeout(timer);
            timer=null;
        },wait);
    }
 
    return function () {
        context=this;
        args=arguments;
        if(!timer){
            console.log("throttle, set");
            run();
        }else{
            console.log("throttle, ignore");
        }
    }
 
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104424.html

相关文章

  • 详谈js抖和节流

    摘要:本文会分别介绍什么是防抖和节流,它们的应用场景,和实现方式。防抖和节流都是为了解决短时间内大量触发某函数而导致的性能问题,比如触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。 本文由小芭乐发表 0. 引入 首先举一个例子: 模拟在输入框输入后做ajax查询请求,没有加入防抖和节流的效果,这里附上完整可执行代码: 没有防抖 ...

    shevy 评论0 收藏0
  • 彻底弄懂函数抖和函数节流

    摘要:若时间差大于间隔时间,则立刻执行一次函数。不同点函数防抖,在一段连续操作结束后,处理回调,利用和实现。函数防抖关注一定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次。 原博客地址,欢迎star 函数防抖和节流 函数防抖和函数节流:优化高频率执行js代码的一种手段,js中的一些事件如浏览器的resize、scroll,鼠标的mousemove、mouseover...

    Mr_houzi 评论0 收藏0
  • 函数抖和节流

    摘要:应用场景给按钮加函数防抖防止表单多次提交。对于输入框连续输入进行验证时,用函数防抖能有效减少请求次数。参考十分钟学会防抖和节流轻松理解函数节流和函数防抖 函数防抖和节流 防抖 对于触发非常频繁又没有必要每次都执行的事件,希望合并到一次去执行; 实现思路: 事件触发后,在规定的时间范围内如果事件重复触发,那么忽略之前触发的事件,并且重新开始计时,直到某一次事件触发后大于规定时间,我们才执...

    daydream 评论0 收藏0
  • JavaScript抖和节流

    摘要:概念函数防抖和函数节流,两者都是优化高频率执行代码的一种手段。防抖任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。节流指定时间间隔内只会执行一次任务一定时间内方法只跑一次。 概念 函数防抖和函数节流,两者都是优化高频率执行js代码的一种手段。 防抖:任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。 节流:指定时间间隔内只会执行一次任...

    DevWiki 评论0 收藏0
  • 函数的抖和节流是个啥???

    摘要:函数防抖和节流,都是控制事件触发频率的方法。封装一个函数,让持续触发的事件监听是我们封装的这个函数,将目标函数作为回调传进去,等待一段时间过后执行目标函数第二点实现了,再看第一点持续触发不执行。 曾经面试时候被问到过这个,年少的我一脸无知。。。 后来工作中遇到了一个场景:输入名称的同时去服务器校验名称是否重复,但发现之前的代码竟然都没做限制,输入一次发一次请求。简直忍不了,就在项目的u...

    edagarli 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<