js函数节流

    我们知道,js有些事件例如resize,mousemove等是会不间断触发的,例如我们简单的一个scroll事件:   

function scrollFn(){console.log(1)
}
window.onscroll=scrollFn

   

    我们需要在滚动的时候去做一些事情,如上图可见,我们只是简单的console,在一次滚动过程中函数即执行了将近20次,如果这个函数有更为复杂的方法,比如操作dom或者其他交互,会严重影响性能。为了避免这个问题,我们一般会使用定时器来对函数进行节流。

   函数节流的基本思想是设置一个定时器,在指定时间间隔内运行代码时清楚上一次的定时器,并设置另一个定时器,知道函数请求停止并超过时间间隔才会执行。

   在javascript高级程序设计中,定义了一个方法,如下:  

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

  throttle函数接收两个参数,即要执行的函数及执行环境,如果执行环境未定义,默认则为windows。在这个函数中,会在第一次执行时为method顶一个定时器属性,在指定时间间隔(300)内再次执行时会清楚上一次定义的定时器并创建新定时器知道停止。

function scrollFn(){console.log(1)
}
function throttle(method,context){clearTimeout(method.tId);method.tId=setTimeout(function(){method.call(context)},300)
}
window.onscroll=function(){throttle(scrollFn)
}

       网上还有一种解决方案:

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

 

 

       调用结果和第一种结果相同,都能有效的阻止函数重复调用,不同的是,第一种将定时器设置为函数的一个属性,而第二种方案通过闭包来实现。首先在函数内定义一个变量timer,然后返回一个函数,我们知道由于在返回函数中包含对timer的引用,因此timer并不会立即被清除。(我们也可以将timer定义为全局变量)。

       以上两种方案存在一个问题,即如果事件一直触发,那么函数将永远不会被执行,这在某些时候并不符合我们的需求,可能我们只是想在规定时间内减少函数执行次数,所以对以上函数做如下改进:

 

function scrollFn(){console.log(1)
}
function throttle(method,delay,duration){var timer=null;var begin=new Date();    return function(){                var context=this, args=arguments;var current=new Date();        clearTimeout(timer);if(current-begin>=duration){method.apply(context,args);begin=current;}else{timer=setTimeout(function(){method.apply(context,args);},delay);}}
}
window.onscroll=throttle(scrollFn,100,500)

 

 

 

      我们在初始的时候定义一个begin开始时间,当时间间隔超过duration时,则执行一次函数,这样我们做到了不重复调用,又能保证500秒执行一次。

 

参考:http://www.cnblogs.com/dolphinX/p/3403821.html

转载于:https://www.cnblogs.com/mopagunda/p/5323080.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1841):前端面试题之redux管理状态机制

对Redux基本理解 redux是一个独立专门用于做状态管理的JS库, 不是react插件库它可以用在react, angular, vue等项目中, 但基本与react配合使用作用: 集中式管理react应用中多个组件共享的状态和从后台获取的数据 Redux的工作原理Redux使用扩展 使用react-redux简化redux的编码使…

@DateTimeFormat 和 @JsonFormat 注解

https://blog.csdn.net/zhou520yue520/article/details/81348926

结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)

一、题目及题目要求 题目:返回一个整数数组中最大子数组的和。要求:(1)输入一个整形数组,数组里有正数也有负数。(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。&#xf…

如何获得select被选中option的value和text

https://blog.csdn.net/zgrkaka/article/details/83382278

JS——阶乘的三种做法(正向逆向递归)

一、正向求阶乘 function factorial(n) {var product 1, i 2;while (i < n) {product * i;}return product;}alert(factorial(4)); 二、逆向求阶乘 function factorial(n) {var product 1;while (n > 1) {product * n;n--;}return product;}alert(factorial(4)); 三、…

ElasticSearch 6.x 学习笔记:12.字段类型

https://blog.csdn.net/chengyuqiang/article/details/79048800

同意按钮,倒计时10秒,同意按钮变为可提交的

HTML代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <meta h…

前端学习(1850)vue之电商管理系统电商系统vue脚手架安装

1. 先下载node.js&#xff0c;下载地址&#xff1a;https://nodejs.org/en/download/ 找个目录保存&#xff0c;解压下载的文件&#xff0c;然后配置环境变量&#xff0c;将下面的路径配置到环境变量中。 安装node 配置进环境变量 检查是否安装完成 2. npm配置 查看npm配置信息…

使用jquery获取url及url参数的方法及定义JQuery扩展方法

1、jquery获取url很简单&#xff0c;代码如下&#xff1a; window.location.href; 其实只是用到了javascript的基础的window对象&#xff0c;并没有用jquery的知识。 2、jquery获取url参数比较复杂&#xff0c;要用到正则表达式&#xff0c;所以学好javascript正则式多么重要的…

前端学习(1851)vue之电商管理系统电商系统vue创建项目

1输入命令vue-ui 2点击创建 3初始化 4手动配置项目 点击创建项目 创建完成 安装插件 点击安装即可 配置插件 点击依赖 安装依赖

在Google Maps 上点击标签后显示说明

JS如下&#xff1a; (function() { window.onload function() { // Creating an object literal containing the properties // you want to pass to the map var options { zoom: 3, center: new google.maps.LatLng(37.09, -95.71), mapTypeId: google.maps.MapTypeId.RO…

static class 静态类(Java)

https://www.cnblogs.com/KingIceMou/p/7823918.html

前端学习(1851)vue之电商管理系统电商系统配置ssh

1登录到码云 2设置 生成公钥 3添加公钥 验证成功

MiseringThread.java 解析页面线程

MiseringThread.java 解析页面线程 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner;import java.util.Set;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** 解析页面线程* author InJavaWeTrust**/ public…

前端学习(1852)vue之电商管理系统电商系统托管码云上

1新建仓库 2执行命令 3添加git add . 3git add files 提交