欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

27.JavaScript实现函数防抖和函数节流

程序员文章站 2022-04-15 21:57:12
1.JavaScrip实现函数防抖 this.myPlugin = this.myPlugin || {}; /** * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数 */ this.myPlugin.debounce = function (callback, time) { var ......

1.javascrip实现函数防抖

this.myplugin = this.myplugin || {};


/**
 * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数
 */
this.myplugin.debounce = function (callback, time) {
    var timer = null; //通过闭包存储计时器
    return function () {
        timer && cleartimeout(timer); //每次执行前,将计时器清空
        var args = arguments; //利用闭包,保存每次传入的形参
        timer = settimeout(function () {
            callback.apply(null, args);
        }, time);
    };
};

调用函数防抖:

<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>

<body>
    <input type="text">
    <script src="./js/myplugin.js"></script>
    <script>
        var inp = document.getelementsbytagname("input")[0];
        //输入框,若一秒内没有输入内容,则输出输入框中的内容
        var handle = myplugin.debounce(function (val, inp) {
            console.log(val);
            console.log("inp是this指向:" + inp);
        }, 1000);
        inp.oninput = function () {
            handle(this.value, this)
        };
    </script>
</body>

</html>

效果展示:

27.JavaScript实现函数防抖和函数节流

 

 

 

2.javascript实现函数节流:

this.myplugin = this.myplugin || {};

/**
 * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数
 * 如:某个动作结束后,一秒后执行该函数
 */
this.myplugin.debounce = function (callback, time) {
    var timer = null; //通过闭包存储计时器
    return function () {
        timer && cleartimeout(timer); //每次执行前,将计时器清空
        var args = arguments; //利用闭包,保存每次传入的形参
        timer = settimeout(function () {
            callback.apply(null, args);
        }, time);
    };
};

/**
 * 函数节流,保证每隔一段时间,某个函数只执行一次
 * 如:某个动作操作时,每一秒后执行一次该函数
 */

 this.myplugin.throttle = function(callback, time, immediately){
    !immediately && (immediately = false);//默认赋值为false
    var timestamp,//时间戳
    timer = null;//利用闭包存储计时器
    return function(){
        if(immediately){//立即执行后,在每隔一段时间执行一次
            if(!timestamp || (timestamp - date.now()) > time){//
                callback.apply(null, args);
                timestamp = date.now();
            }
        }else{//每隔一段时间后执行一次
            if(timer){//计时器有值,则直接return
                return;
            }
            var args = arguments;//利用闭包,保存每次传入的形参
            timer = settimeout(function(){
                callback.apply(null, args);
                timer = null;//执行完本次函数,要清空计时器
            }, time);
        }
    };
 };