美文网首页
截流函数

截流函数

作者: susu一口酥 | 来源:发表于2021-02-27 11:32 被阅读0次
  • 创建并返回一个像节流阀一样的函数,当重复调用函数的时候,至少每隔 wait毫秒调用一次该函数。对于想控制一些触发频率较高的事件有帮助。
  • 默认情况下,throttle将在你调用的第一时间尽快执行这个function,并且,如果你在wait周期内调用任意次数的函数,都将尽快的被覆盖。如果你想禁用第一次首先执行的话,传递{leading: false},还有如果你想禁用最后一次执行的话,传递{trailing: false}。
/**
* 截流函数
* @param fn   需要执行的函数
* @param wait   等待的时间
* @param options   leading:false 禁用第一次执行; trailing:false 禁用最后一次执行
*/
const throttle = function(fn,wait,options){
    //定义定时器函数、上下文对象、参数、返回结果
    let timeout,context,args,result;
    // 上一次执行的时间戳
    let previos = 0;
    //如果没有options,则赋值为空对象
    if(!options) options = {};
    //定义延迟执行函数
    const later = function(){
        // 禁用第一次执行,则上次执行为0;否则为当前时间
        previos = options.leading === false ? 0 : (new Date()).valueOf();
        // 清除timeOut(因为已经是在timeout执行方法内,不需要clear)
        timeout = null;
        //执行函数
        result = fn.apply(context,args);
        // 清除定时器
        if(!timeout) context = args = null;
    }
    // 定义截流函数
    const throttled = function(){
        //获取当前时间戳
        let now = (new Date()).valueOf();
        //如果没有之前执行的时间并且禁用第一次执行,上次执行时间为当前时间
        if(!previos && options.leading === false) previos = now;
        // 计算执行等待时间
        // 等待时间 - (当前时间 - 上一次执行时间)
        let remaining = wait - (now - previos);
        // 上下文对象为当前this
        context = this;
        //args为数组格式
        args = arguments;
        //如果执行等待时间,不落在wait内,则执行。
        if(remaining <= 0 || remaining > wait){
            // 如果有计时器
            if(timeout){
                clearTimeout(timeout);
                timeout = null;
            }
            // 上次执行时间记录为当前
            previos = now;
            //替换函数this执行
            result = fn.apply(context,args);
            // 如果没有计时器,清除context 和 args
            if(!timeout) context = args = null;
        }
        //如果没有计时器,并且禁用最后一次执行
        else if(!timeout && options.trailing !== false){
            timeout = setTimeout(later,remaining);
        }

        return result;
    }
    //定义截流函数的取消方法
    throttle.cancel = function(){}
    //返回截流函数执行
    return throttled;
}

相关文章

  • 截流函数

    创建并返回一个像节流阀一样的函数,当重复调用函数的时候,至少每隔 wait毫秒调用一次该函数。对于想控制一些触发频...

  • scroll事件的性能

    防抖函数:强制一个函数在某个连续时间段内只执行一次 截流函数:固定函数执行的速率 原生节流:同throttle,只...

  • 如何利用“截流”技巧获取海量精准现成粉丝

    如何利用“截流”技巧获取海量精准现成粉丝 混网络圈的朋友,应该都听说过“截流”。比如说,公众号截流、QQ群截流、微...

  • 不是引流没用,而是你的引流方法没用!

    晚上好,我是周泽。混网络圈的朋友,应该都听说过“截流”。比如说,公众号截流、QQ群截流、微博截流等等,互联网之大,...

  • 截流的各种高级玩法

    截流的各种高级玩法 常年混迹于网络圈的,可能听说过截流。也有些朋友,不懂什么是截流。那传说中的截流是怎么玩的呢?今...

  • 截断长江水,大军鏖战急,三峡耸奇观|三峡工程典藏⑦

    截流戗堤预进占 水深六十米,截流难上难。 抛石先垫底,戗堤预进占。 (注:三峡大江截流因葛洲坝水库抬高水位20多米...

  • 截流

    一些vue功能实现 搜索关键词的截流

  • 💋截流👄

    我流泪了吗?没有 我真的流泪了吗?没有 难道我真的流泪了吗?无语 那我要追索Ta的源头 挖Ta的根 截Ta的流……...

  • 截流

    背影留下的气息 被秋风悉数掠走 一旦遇到阻挡 回旋处 总能生出莲花 千里追寻的目光 瞬间秒变成 一个个心灵驿站 一...

  • 截流

    不要沉迷在语言和发出声音的内在反射,你说出来就代表你有这个思想,并且已经很是健壮。思维毒草根系广阔,需要时时密切关...

网友评论

      本文标题:截流函数

      本文链接:https://www.haomeiwen.com/subject/zenbfltx.html