js高性能函数防抖与节流详解

函数节流是指一定时间内js方法只跑一次,函数防抖:是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。本文主要和大家分享js高性能函数防抖与节流详解,希望能帮助到大家。

一.函数节流(throttle)

1.函数节流的目的
例如,DOM 操作比起非DOM 交互需要更多的内存和CPU时间。连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃。尤其在IE 中使用onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发。在onresize 事件处理程序内部如果尝试进行DOM 操作,其高频率的更改可能会让浏览器崩溃。又例如,我们常见的一个搜索的功能,我们一般是绑定keyup事件,每按下一次键盘就搜索一次。但是我们的目的主要是每输入一些内容搜索一次而已。为了解决这些问题,就可以使用定时器对函数进行节流。
2.函数节流的原理
某些代码不可以在没有间断的情况连续重复执行。第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。当第二次调用该函数时,它会清除前一次的定时器并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。目的是只有在执行函数的请求停止了一段时间之后才执行。

3.函数节流的基本模式

var processor = {   timeoutId: null,     //实际进行处理的方法   performProcessing: function(){     //实际执行的代码   },  //初始处理调用的方法  process: function(){    clearTimeout(this.timeoutId);    var that = this;    this.timeoutId = setTimeout(function(){      that.performProcessing();    }, 100);  }};//尝试开始执行processor.process();

登录后复制

4.列子

nbsp;html>            function queryData(text){  console.log("搜索:" + text);}var input = document.getElementById("search");input.addEventListener("keyup", function(event){  throttle(queryData, null,500,this.value,1000);});        function throttle(fn,context,delay,text,mustApplyTime){  clearTimeout(fn.timer);  fn._cur=Date.now();  //记录当前时间   if(!fn._start){      //若该函数是第一次调用,则直接设置_start,即开始时间,为_cur,即此刻的时间    fn._start=fn._cur;  }  if(fn._cur-fn._start>mustApplyTime){        //当前时间与上一次函数被执行的时间作差,与mustApplyTime比较,若大于,则必须执行一次函数,若小于,则重新设置计时器     fn.call(context,text);     fn._start=fn._cur;  }else{    fn.timer=setTimeout(function(){    fn.call(context,text);    },delay);  }}  

登录后复制

JavaScript 节流函数 Throttle 详解

谈谈JS中的函数节流

二.函数防抖(debounce)

在解释这个函数前,我们先看下例子:注册页面,需要验证电话号码。此时我们可能想到的做法就是监听keypress事件,然后异验证。这个方法本身是没错的,但是如果用户快速的输入了一连串的手机号码,那么就会在瞬间触发了11次的请求,这无疑不是我们想要的。我们想要的是用户停止输入的时候才去触发验证的请求,这时候函数防抖可以帮到我们。

function debounce(func, wait, immediate) {    var timeout; // 持久化一个定时器     // 闭包函数可以访问timeout    return function() {     // 通过 this 和 arguments 获得函数的作用域和参数        var context = this, args = arguments;        var later = function() {            timeout = null;            if (!immediate) func.apply(context, args);        };        var callNow = immediate && !timeout;        clearTimeout(timeout); // 如果事件被触发,清除timer并重新开始计时        timeout = setTimeout(later, wait);        if (callNow) func.apply(context, args);    };};

登录后复制

参数function是需要进行函数防抖的函数;参数wait则是需要等待的时间,单位为毫秒;immediate参数如果为true,则debounce函数会在调用时立刻执行一次function,而不需要等到wait这个时间后,例如防止点击提交按钮时的多次点击就可以使用这个参数。

列子:

nbsp;html>函数防抖与节流 

登录后复制function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); };};function checkTel(){var val = $(“#tel”).val(); var re = new RegExp(“(^1[3|4|5|7|8][0-9]{9}$)”); if(re.test(val)){ console.log(“结果:格式正确”); }else{ console.log(“结果:格式错误”); } } var lazyQuery = debounce(checkTel, 300);$(“#tel”).on(“keypress”,lazyQuery);

js高性能函数防抖与节流详解

这效果就看到触发了6次而不是11次

三.应用场景

(1).函数节流(throttle)
1. 频繁的mousemove/keydown,比如高频的鼠标移动,游戏射击类的
2. 搜索联想(keyup)
3. 进度条(我们可能不需要高频的更新进度)
4. 拖拽的dragover等
5.  高频的点击,抽奖等(哈哈,邪恶)

(2).函数防抖(debounce)
 1. scroll/resize事件
 2. 文本连续输入,ajax验证/关键字搜索

以上就是js高性能函数防抖与节流详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2781252.html

(0)
上一篇 2025年3月8日 16:14:35
下一篇 2025年3月8日 16:14:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript的json格式实例详解

    json的形式是用大括号“{}”包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式,也再次表明javascript里的对象就是字典结构。不管多么复杂的对象,都可以用一句jso…

    2025年3月8日
    200
  • javascript常用工具类的封装总结

    本文主要和大家分享javascript常用工具类的封装总结,希望能帮助到大家。 一.javaScript 1. type 类型判断 isString (o) { //是否字符串    return Object.prototype.toSt…

    编程技术 2025年3月8日
    200
  • JavaScript正则表达式小技巧

    这次给大家带来JavaScript正则表达式小技巧,使用JavaScript正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式作为一种匹配处理字符串的利器在很多语言中都得到了广泛实现和应用.这篇文章主要介绍了JavaS…

    编程技术 2025年3月8日
    200
  • 原生js怎么调用json

    这次给大家带来原生js怎么调用json,原生js调用json的注意事项有哪些,下面就是实战案例,一起来看一下。 Ajax基础 ajax:无刷新数据读取,读取服务器上的信息 HTTP请求方法: GET:用于获取数据,如浏览帖子 ajax.ju…

    编程技术 2025年3月8日
    200
  • babel的使用详解

    这次给大家带来babel的使用详解,babel使用的注意事项有哪些,下面就是实战案例,一起来看一下。 安装及配置 npm install babel-cli –save-dev 或者 cnpm install babel-cli…

    2025年3月8日
    200
  • JavaScript中的数据截取问题详解

    本文主要和大家分享JavaScript中的数据截取问题详解,希望能帮助到大家。 一.数组中获取 1.获取value的值 var revokeModel = $(“#modalMsgRevoke form”).seri…

    2025年3月8日 编程技术
    200
  • JS实现默认头像填充

    这次给大家带来JS实现默认头像填充,JS实现默认头像填充的注意事项有哪些,下面就是实战案例,一起来看一下。 在我的不少项目中,都有缺省头像的问题。为了保持个性和方便辨认,会给没有头像的用户填充带名字的头像。 代码分享:https://git…

    2025年3月8日
    200
  • webpack打包指定JS文件需要怎么做

    这次给大家带来webpack打包指定JS文件需要怎么做,webpack打包指定JS文件的注意事项有哪些,下面就是实战案例,一起来看一下。 背景 最近接到一个需求,因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方…

    编程技术 2025年3月8日
    200
  • JavaScript中字符串详解

    本文主要和大家分享javascript中字符串详解,希望能帮助到大家。 一.字符串基本 1.字符串的创建 基本的数据类型  String        var str = “字符串”; 引用的数据类型 String …

    编程技术 2025年3月8日
    200
  • JavaScript中的原型与原型链详解

    本文主要和大家分享javascript中的原型与原型链详解,说原型的时候,一般都是在说原型属性prototype。 一.介绍 1.函数的prototype属性 *所有的函数都有一个prototype属性,它默认指向一个object空对象(即…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论