美文网首页
函数节流

函数节流

作者: 正正果实 | 来源:发表于2018-02-24 23:13 被阅读0次

    《JavaScript高级程序设计》中有专门应对此问题的函数节流

    function throttle(method, context) {
        clearTimeout(method.tId);
        method.tId = setTimeout(function() {
            method.call(context);
        }, 500);
    }
    

    利用定时器,让函数执行延迟500毫秒,在500毫秒内如果有函数又被调用则删除上一次调用,这次调用500毫秒后执行,如此往复。代码可以改为

    n = 0;
    function resizehandler() {
        console.log(new Date().getTime());
        console.log(++n);
    }
    
    function throttle(method,context) {
        clearTimeout(method.tId);
        method.tId = setTimeout(function() {
            method.call(context);
        },500);
    }
    
    window.onresize = function() {
        throttle(resizehandler,window);
    };
    

    另一种做法

    function throttle(method,delay) {
        var timer = null;
        return function() {
            var context = this, args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function() {
                method.apply(context,args);
            }, delay);
        }
    }
    

    调用一下试试,一样的效果

    <script type="text/javascript">
        n = 0;
        function resizehandler() {
            console.log(new Date().getTime());
            console.log(++n);
        }
    
        function throttle(method,delay) {
            var timer = null;
            return function() {
                var context = this, args = arguments;
                clearTimeout(timer);
                timer = setTimeout(function() {
                    method.apply(context,args);
                }, delay);
            }
        }
        // 因为返回函数句柄,不用包装函数了
        window.onresize = throttle(resizehandler, 500);
    </script>
    两种方法都是利用了setTimeout,不同的是第二种方法加入的函数延迟执行时间,这个在第一种方案中很容易也具有此功能,加一个参数的事儿。
    但第一种方案把tId设为函数的一个变量保存,而第二种创建了一个闭包来存储。

    相关文章

      网友评论

          本文标题:函数节流

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