javascript之函数节流

对于高频率的事件触发,为了优化页面性能,我们一般会对其做函数节流。比如: resize、keydow、scroll事件等。用户的频繁操作,会导致事件高频率的执行,这样会出现页面抖动啊、频繁调接口啊等问题。为了优化,我们采用函数节流,原理就是利用setTimeout控制触发回掉的频率。

1.第一种方案:

var timer;
        function throttle1(fun,sec){
            clearTimeout(timer);
            timer = setTimeout(function(){
                fun();
            },sec);
        }

$(function(){
    $(window).scroll(function(){
                throttle1(function(){
                    console.log(‘我滚!!!‘);
                },500);
            });
});

第一种方案最简单,原理一看就懂,用setTimeout的目的是在用户触发之后到500毫秒之内不会执行回调,500毫秒才会执行回调一次,对于之前的事件触发是没有执行回调的。但缺陷是无法获取回调的传入参数,即使可以获取,也不能保证执行上下文this的指向。

2.第二种方案:

function throttle2(fun,sec){
            var timer = null;
            return function(){
                clearTimeout(timer);
                var context = this,arg = arguments;
                timer = setTimeout(function(){
                    fun.apply(context,arg);
                },sec);
                timeer = null;
            }
        }

$(function(){
   $(window).scroll(
                throttle2(function(){
                    console.log(‘我滚!!!‘);
                },500)
            );
});

第二种方案能保证回调函数的执行上下文,支持回调的多参数传入。

但是大家都知道setTimeout是一个异步函数,会被挂起,放到异步队列的最后。当主线程执行完之后,才会执行异步队列里的回调。在用户不停的操作:如不停的滚动滚动条、改变窗口大小的时候,setTimeout是会被挂起,只有在用户操作完,才会执行setTimeout的回调。那么问题来了,用户一直操作会影响正常功能使用啊!那第三种方案就是为了解决setTimeout被挂起之后,回调函数不执行的问题。

3.第三种方案:

function throttle3(fun,sec,mustRunDelay){
            var timer = null;
            var t_start;
            return function(){
                var context = this, args = arguments, t_curr = +new Date();
                clearTimeout(timer);
                if(!t_start){
                    t_start = t_curr;
                }
                if(t_curr - t_start >= mustRunDelay){
                    fun.apply(context, args);
                    t_start = t_curr;
                }else {
                    timer = setTimeout(function(){
                        fun.apply(context, args);
                    }, sec);
                }

            }
        }

$(function(){
   $(window).scroll(
                throttle3(function(){
                    console.log(‘我滚!!!‘);
                },500,1000)
            );
})

利用第三种方案,就完美的解决了setTimeout被挂起的情况,保证用户的正常操作效果。

时间: 2024-10-10 21:15:10

javascript之函数节流的相关文章

浅谈javascript的函数节流

什么是函数节流? 介绍前,先说下背景.在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(其核心就是绑定mousemove),这种事件有一个特点,就是用户不必特地捣乱,他在一个正常的操作中,都有可能在一个短的时间内触发非常多次事件绑定程序.而大家知道,DOM操作时很消耗性能的,这个时候,如果你为这些事件绑定一些操作DOM节点的操作的话,那就会引发大量的计算,在用户看来,页面可能就一时间没有响应,这个页面一下子变卡了变慢了.甚至在IE下,如果你绑定的resize事件进行

简述JavaScript函数节流

为什么要用函数节流 浏览器中某些计算和处理要比其他的昂贵很多.例如,DOM 操作比起非 DOM 交互需要更多的内存和 CPU 时间.连续尝试进行过多的 DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃.尤其在 IE 中使用 onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发.在 onresize 事件处理程序内部如果尝试进行 DOM 操作,其高频率的更改可能会让浏览器崩溃.为了绕开这个问题,你可以使用定时器对该函数进行节流. 常见的有:重新调整浏览器窗口

再谈javascript函数节流

之前写过但是不记得在哪了,今天同事要一个滑到页面底部加载更多内容的效果,又想起了这玩意儿,确实挺实用和常用的,谨此记之. 函数节流从字面上的意思就是节约函数的执行次数,其实现的主要思想是通过定时器阻断函数的连续执行,尤其适合用在频繁操作,比如window的resize和scroll事件等. window的默认scroll事件间隔时间大概只有十几毫秒,如果频繁的scroll,然后去请求,然后渲染,对性能肯定有很大的影响. 大概模式: var processor = { timer: null, p

JavaScript函数节流与函数去抖

介绍 首先解释一下这两个概念: 函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次函数执行后过了规定的时间间隔,才能进行下一次该函数的调用. 函数去抖(debounce):让一个函数在一定间隔内没有被调用时,才开始执行被调用方法. 两个方法都是用来提升前端性能,减轻浏览器压力. 应用 理解起来有点费力,通过应用来理解就轻松了.通常,我们会在有用户交互参与的地方添加事件,而往往这种事件会被频繁触发. 想象一下窗口的resize事件或者是一个元素的onmousemov

JavaScript函数节流

函数节流 技术一般水平有限,有什么错的地方,望大家指正. 函数节流就是节约函数的调用,让函数少执行几次,一般用在onmousemove,onresize这种我们只要稍微一动就会砰砰砰执行多次的事件处理函数上.如果处理函数很复杂有执行很多次就很耗性能关键了有的是没有必要执行的. 我们先说一个经常遇见的情况,鼠标放在按钮上显示下拉菜单,鼠标离开下拉菜单消失,通常我们这么写: //title表示标题元素,content表示下拉菜单 $("#title").hover(function(){

JavaScript 频繁发射事件处理的优化 --- 函数节流/事件稀释

引子:昨天面试时面试官问了如何实现一个固定导航栏,在我答完后面试官问我可能存在哪些问题,如何优化? 这个问题我答得不太好,但现在回想起来应该有两个问题: 1. 把 fixbar元素 position:fixed 之后,它将脱离文档流,后面的元素将会跟上,这可能会形成一个闪烁,解决方法是跟随的元素设置 margin-top 为 fixbar 元素的高度,或者替换上一个等高的元素,这点面试时候没有描述出来. 2. 就是这篇博文主要内容 ”函数节流“,英文名 throttle 函数,在一些库,如und

javascript中的函数节流和函数去抖

带着问题去尝试 首先我们要知道为什么要用到函数节流和函数去抖?我们带着以下的疑问来进行分析! 1.比如搜索框,你会用到什么事件(change.blur.keyup等)?去做什么效果?2.再比如scroll滚动事件,怎么去触发?是滚一段距离触发一次?还是滚一圈触发一次?还是滚一次触发一次?3.还包括mouseover事件是怎么触发呢?...... 场景实例 函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.举个例子,实现一个原生的拖拽功能(不能用 H5 Drag&Drop API)

JavaScript性能优化技巧之函数节流

函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用.对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理.但是对于在用户界面调用的函数,却非常有意义. AD:51CTO网+ 首届中国APP创新评选大赛>> 函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用.对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理.但是对于在用户界面调用的函数,却非常有意义.例如一个 mousemove

JavaScript函数节流和函数防抖的原理与区别

一.概念解释 ?函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段.?大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变化,当高频率的扫描,人类是感觉不出来的.反而形成一种视觉效果,就是一张图.就像高速旋转的风扇,你看不到扇叶,只看到了一个圆一样.?同理,可以类推到js代码.在一定时间内,代码执行的次数不一定要非常多.达到一定频率就足够了.因为跑得越多,带来的效果也是一样.倒不如,把js代码的执行次数控制在合理的范围.