美文网首页
函数节流与函数防抖

函数节流与函数防抖

作者: 你在我记忆里 | 来源:发表于2018-02-02 18:17 被阅读27次

    概念

    <a href="http://blog.jimliu.xyz/2018/02/02/debounce/">原文地址</a>
    <b>函数防抖(debounce)</b>

    当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间

    <b>函数节流(throttle)</b>

    预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期

    区别

    函数防抖:如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。

    函数节流 :保证如果电梯第一个人进来后,10秒后准时运送一次,这个时间从第一个人上电梯开始计时,不等待,如果没有人,则不运行

    实现

    函数防抖

    function debounce(fn, wait) {
        var timer = null;
        return function () {
            var context = this
            var args = arguments
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            timer = setTimeout(function () {
                fn.apply(context, args)
            }, wait)
        }
    }
    

    函数节流

    function throttle(fn, wait) {
        var previous = 0
        var timer = null
        return function () {
            var context = this
            var args = arguments
            if (!previous) {
                previous = Date.now()
                fn.apply(context, args)
            } else if (previous + wait >= Date.now()) {
                if (timer) {
                    // console.log(timer)
                    clearTimeout(timer)
                    timer = null
                }
                // console.log(timer)
                timer = setTimeout(function () {
                    // console.log(timer)
                    previous = Date.now()
                    fn.apply(context, args)
                }, wait)
            } else {
                previous = Date.now()
                fn.apply(context, args)
            }
        }
    }
    

    应用场景

    <b>函数防抖</b>

    • 每次 resize/scroll 触发统计事件
    • 文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,验证一次就好)

    <b>函数节流</b>

    • DOM 元素的拖拽功能实现(mousemove)
    • 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
    • 计算鼠标移动的距离(mousemove)
    • Canvas 模拟画板功能(mousemove)
    • 搜索联想(keyup)
    • 监听滚动事件判断是否到页面底部自动加载更多:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次

    <a href="http://blog.jimliu.xyz/2018/02/02/debounce/">原文地址</a>

    相关文章

      网友评论

          本文标题:函数节流与函数防抖

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