分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

js 函数节流 ?jQuery throttle/debounce

发布时间:2023-09-06 01:37责任编辑:傅花花关键词:jsjQuery

在《JavaScript高级程序设计》一书有介绍函数节流,里面封装了这样一个函数节流函数:

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

它把定时器ID存为函数的一个属性。而调用的时候就直接写

window.onresize = function(){ ???throttle(myFunc);}

impress用的是另一个封装函数:

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

它使用闭包的方法形成一个私有的作用域来存放定时器变量timer。而调用方法为

window.onresize = throttle(myFunc, 100);

两种方法各有优劣,前一个封装函数的优势在把上下文变量当做函数参数,直接可以定制执行函数的this变量;后一个函数优势在于把延迟时间当做变量(当然,前一个函数很容易做这个拓展),而且个人觉得使用闭包代码结构会更优,且易于拓展定制其他私有变量,缺点就是虽然使用apply把调用throttle时的this上下文传给执行函数,但毕竟不够灵活。

上面介绍的函数节流,它这个频率就不是50ms之类的,它就是无穷大,只要你能不间断resize,刷个几年它也一次都不执行处理函数。我们可以对上面的节流函数做拓展:

 var throttleV2 = function(fn, delay, 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){ ???????????fn.apply(context, args); ???????????t_start = t_curr; ???????} ???????else { ???????????timer = setTimeout(function(){ ???????????????fn.apply(context, args); ???????????}, delay); ???????} ???}; };

在这个拓展后的节流函数升级版,我们可以设置第三个参数,即必然触发执行的时间间隔。如果用下面的方法调用

window.onresize = throttleV2(myFunc, 50, 100);

则意味着,50ms的间隔内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔100ms至少执行一次。原理也很简单,打时间tag,一开始记录第一次调用的时间戳,然后每次调用函数都去拿最新的时间跟记录时间比,超出给定的时间就执行一次,更新记录时间。

js 函数节流 ?jQuery throttle/debounce

原文地址:https://www.cnblogs.com/richardcastle/p/8297403.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved