美文网首页前端大全
浅析前端函数防抖与节流

浅析前端函数防抖与节流

作者: yun_154192 | 来源:发表于2019-03-11 15:24 被阅读8次

在前端开发的过程中,我们经常会遇到持续触发的事件,如resize、scroll、mousemove等等,但是我们并不想在执行的时候频繁的去触发相应事件,此时函数防抖与节流可以很好的解决。

所谓防抖,是指触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。
所谓节流,就是指连续触发事件但是在n秒中只执行一次函数

(一)函数防抖分为非立即执行版与立即执行版

1.非立即执行版:

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

2.立即执行版:

function debounce (func, wait) {
    var timeout;
    return function () {
        var context = this;
        var args = arguments;
        if (timeout) clearTimeout(timeout);
        var runNow = !timeout;
        timeout = setTimeout(function () {
            timeout = null;
        }, wait);
        if (runNow) func.apply(context, args);
    }
}

3.综合版:

/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行,false 表非立即执行
 */
function debounce (func, wait, immediate) {
    var timeout;
    return function () {
        var context = this;
        var args = arguments;
        if (timeout) clearTimeout(timeout);
        if (immediate) {
            var runNow = !timeout;
            timeout = setTimeout(function () {
                timeout = null;
            }, wait);
            if (runNow) func.apply(context, args);
        } else {
            timeout = setTimeout(function () {
                func.apply(context, args);
            }, wait);
        }
    }
}

(二)函数节流分为时间戳版与定时器版

1.时间戳版:

function throttle (func, wait) {
    var previous = 0;
    return function () {
        var now = Date.now();
        var context = this;
        var args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }
}

2.定时器版:

function throttle (func, wait) {
    var timeout;
    return function () {
        var context = this;
        var args= arguments;
        if (!timeout) {
            timeout = setTimeout (function () {
                timeout = null;
                func.apply(context, args);
            }, wait);
        }
    }
}

上述两个版本的区别是时间戳版的函数执行是在时间段开始的时候,而定时器版的函数执行是时间段结束的时候。
3.综合版:

/**
 * @desc 函数节流
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param type 1 表时间戳版,2 表定时器版
 */

function throttle (func, wait, type) {
    if (type === 1) {
        var previous = 0;
    }else if (type === 2) {
        var timeout;
    }
    return function () {
        var rcontext = this;
        var args = arguments;
        if (type === 1) {
            var now = Date.now();
            if (now - previous > wait) {
                func.apply(context, args);
                previous = now;
            }
        } else if (type === 2) {
            if (!timeout) {
                timeout = setTimeout(function () {
                    timeout = null;
                    func.apply(context, args);
                }, wait);
            }
        }
    }
}

相关文章

  • 函数节流与函数防抖

    函数节流与函数防抖的区别JS魔法堂:函数节流(throttle)与函数去抖(debounce)函数的防抖与节流 自...

  • 浅析前端函数防抖与节流

    在前端开发的过程中,我们经常会遇到持续触发的事件,如resize、scroll、mousemove等等,但是我们并...

  • 函数防抖与节流

    函数防抖与节流 函数防抖与节流是很相似的概念,但它们的应用场景不太一样。 函数防抖: 任务频繁触发的情况下,只有任...

  • JS函数防抖与节流

    函数节流和防抖在前端开发中应用广泛,例如:函数防抖可以用于对用户输入的自动补全操作、函数节流可以用于对用户浏览行为...

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • JavaScript中的防抖(debounce)和节流(thro

    防抖函数 节流函数

  • JS封装一个防抖函数与节流函数

    防抖函数 节流函数

  • 函数操作v1.0.0

    目录 函柯里化函数节流函数防抖 正文 函柯里化 函数节流 函数防抖

  • JavaScript:函数防抖与节流

    什么是函数防抖与节流? 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段。 定义: 防抖: n 秒后在...

  • 函数节流与函数防抖

    节流与防抖的概念 函数节流与函数防抖的目的都是为了减少用户对服务器不必要的请求次数,以此提高服务器性能的函数。节流...

网友评论

    本文标题:浅析前端函数防抖与节流

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