什么是函数节流?

什么是函数节流?

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

函数节流的原理

函数节流的原理挺简单的,估计大家都想到了,那就是定时器。当我触发一个时间时,先setTimout让这个事件延迟一会再执行,如果在这个时间间隔内又触发了事件,那我们就clear掉原来的定时器,再setTimeout一个新的定时器延迟一会执行,就这样。

var main = {

    changeScreen: {
        init: function() {
            var _this = this;
            _this.obtainScreen();
            _this.resizeScreen();
        },

        obtainScreen: function() {
            var screenWidth,
                ua = navigator.userAgent.toLocaleLowerCase(),
                v = $.browser.version,
                $resizeScreen = $( "#resizeScreen" );

            screenWidth = window.innerWidth ? window.innerWidth :
                document.documentElement.clientWidth;

            if ( ua.indexOf( "msie" ) > -1 && +v < 10 ) {
                if( screenWidth >= 1540 ) {
                    $resizeScreen.addClass( "w1240" );
                } else {
                    $resizeScreen.removeClass( "w1240" );
                }
            }
        },

        //函数节流的原理挺简单的,估计大家都想到了,那就是定时器
        throttle: function( fn, delay ) {
            var timer = null;
            return function() {
                var context = this, args = arguments;
                clearTimeout( timer );
                timer = setTimeout(function() {
                    fn.apply( context, args );
                }, delay );
            };
        },

        resizeScreen: function() {
            var _this = giftCommon.changeScreen;

            window.onresize = _this.throttle( _this.obtainScreen, 100 );
        }
    }

};
时间: 2024-10-05 06:16:50

什么是函数节流?的相关文章

js的函数节流(throttle)

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

函数节流

1. 函数节流: 由于dom操作极其昂贵,所以尝试过多的dom操作有可能会将浏览器搞崩溃,比如onresize.onscroll这类事件操作: 为了解决这个问题,引出函数节流的概念(某些代码不可以在没有间断的情况下连续重复执行): 方案:第一次调用函数创建一个定时器,在指定时间之后执行代码:在第二次调用时,清除掉前一次的定时器并重新设置一个: 这种方案下,如果第一个定时器已经执行,这个操作就没意义:如果第一个没执行,则将其替换为新的定时器:目的是只有在执行函数的请求停止一段时间后才执行: 适用于

JS中的函数节流

函数节流的目的 从字面上就可以理解,函数节流就是用来节流函数从而一定程度上优化性能的.例如,DOM 操作比起非DOM 交互需要更多的内存和CPU时间.连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃.尤其在IE 中使用onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发.在onresize 事件处理程序内部如果尝试进行DOM 操作,其高频率的更改可能会让浏览器崩溃.又例如,我们常见的一个搜索的功能,我们一般是绑定keyup事件,每按下一次

JS函数节流

背景:在前端开发中,有时会为页面绑定resize事件,或为一个页面元素拖拽事件(其核心就是绑定mousemove)在一个正常操作中也有可能在一个短时间内触发非常多次事件绑定程序,而DOM操作是很消耗性能的,如果为这些事件绑定一些操作DOM节点的操作的话就会引发大量的计算,在用户看来页面可能就一时间没有响应,这个页面就变卡变慢了,甚至在IE下,如果绑定的resize事件进行较多DOM操作,其高频率可能直接就使得浏览器崩溃.函数节流简单讲就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数

JavaScript函数节流

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

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

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

JS高阶函数应用——函数节流

在一些函数需被频繁调用的场景,如:window.onresize.mousemove.上传进度等等,操作频繁导致性能消耗过高,而造成浏览器卡顿现象,我们可以通过函数节流的方式解决此问题.   比如我们在window.onresize事件中打印当前浏览器窗口的大小,而拉拽窗口的时候,打印窗口大小的工作1s内进行了10次.而实际是我们只需2次或3次,这就需要我们按时间段来忽略一些事件请求,比如确保在500ms内只打印1次.实现代码如下: var throttle=function(fn,interv

再谈javascript函数节流

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

浅谈javascript的函数节流

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