javascript 函数节流

参考

为什么需要函数节流

函数被频繁调用,不是由用户直接控制的,且造成大的性能问题。
1. window.resize事件
2. mousemove事件
3. 上传进度

实现原理

通过逻辑限制1秒执行n次或者x毫秒内只能执行一次,具体通过高阶函数和闭包实现函数节流逻辑和具体函数执行的分离。

实例代码

function(fn,interval){
    var _self = fn
    var timer
    var first = true

    return function(){
        var _me = this
        var args = arguments

        if(first){//第一次执行
            var ret = _self.apply(_me,args)
            return first = false
        }

        if(timer){//如果定时器还在,说明前一次延迟执行还没有完成
            return false
        }

        timer = setTimeout(function(){ //延迟一段时间执行
            clearTimeout(timer)
            timer = null
            _self.apply(_me,args)
        },interval || 500)
    }
}

自己实现的版本

//throttle 函数节流要点是,声明一个变量当标志位,记录当前代码是否在执行。
function throttle(fn,interval){
    //是否执行标识
    var isCallFn = false;
    return function(){
        if(!isCallFn){
            isCallFn = true;
            var result = fn.apply(this,arguments);
            setTimeout(function(){
                isCallFn = false;
            },interval);
            return true;
        }else{
            return false;
        }
    }
}

//debounce 函数防抖要点是,需要一个setTimeout来辅助实现。延迟执行需要跑的代码。
function debounce(fn,interval){
    var timerId = null;
    return function(){
        var _this = this;
        if(!timerId){//有定时执行就清除,用最新的再延时执行
            clearTimeout(timerId)
            timerId=null;
        }

        timerId = setTimeout(function(){
            clearTimeout(timerId)
            timerId=null;
            fn.apply(_this,arguments);
        },interval);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值