手写节流throttle

2024-06-04 04:52
文章标签 手写 节流 throttle

本文主要是介绍手写节流throttle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

节流throttle

应用场景
  • 滚动事件监听scroll:例如监听页面滚动到底部加载更多数据时,使用节流技术减少检查滚动位置的频率,提高性能。
  • 鼠标移动事件mousemove:例如实现一个拖拽功能,使用节流技术减少鼠标移动事件的处理频率。
  • 动画效果:当实现一个基于时间的动画效果时,使用节流技术限制动画帧率,降低计算开销。

它使用了闭包和setTimeout来确保函数fn在指定的delay时间内只被调用一次,即使它被频繁触发。这里是对您代码的一个详细解释:

有很多其他的实现方式....比对时间戳

定时器版
function throttle(fn, delay) {  // 创建一个标志位canRun,默认为true,表示函数可以被执行  let canRun = true;  // 返回一个新的函数,这个函数会包裹原来的fn函数  return function(...args) {  // 如果canRun为false,说明上一次fn的执行还没有完成,直接返回不执行  if (!canRun) {  return;  }  // 在函数执行前将canRun设为false,表示fn正在执行或等待执行  canRun = false;  // 使用setTimeout来设置一个延时,确保fn在delay时间后执行  // 注意:这里的this和args都是从外部函数捕获的,它们代表了原始事件处理函数的上下文和参数  setTimeout(() => {  // 在delay时间后,执行fn函数,并恢复canRun为true,表示可以再次执行fn  fn.apply(this, args);  canRun = true;  }, delay);  };  
}  // 使用示例  
const handleScroll = throttle(function() {  console.log('Scroll event handled.');  
}, 200); // 设置节流间隔为200毫秒  window.addEventListener('scroll', handleScroll);

在这个例子中,handleScroll是节流后的函数,它被用作scroll事件的处理程序。无论用户如何频繁地滚动页面,handleScroll函数都只会每200毫秒执行一次,从而有效地减少了不必要的计算和DOM操作,提高了页面的性能。

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>Throttle Scroll Event Example</title>  
<style>  /* 为了演示,我们可以添加一些样式使页面更长 */  body {  height: 2000px;  }  
</style>  
</head>  
<body>  
<!-- 为了演示,这里添加一些内容使页面更长 -->  
<div style="height: 1000px;">Scroll down to see the throttled scroll event handler in action.</div>  <script>  // 定义节流函数  function throttle(fn, delay) {  let canRun = true;  return function(...args) {  if (!canRun) {  return;  }  canRun = false;  setTimeout(() => {  fn.apply(this, args);  canRun = true;  }, delay);  };  }  // 定义滚动事件处理函数  function handleScroll() {  console.log('Scroll event handled at', new Date().toISOString());  // 这里可以添加实际的滚动处理逻辑,比如加载更多内容、改变样式等  }  // 使用节流函数包装滚动事件处理函数  const throttledScrollHandler = throttle(handleScroll, 2000); // 设置节流间隔为200毫秒  // 添加滚动事件监听器  window.addEventListener('scroll', throttledScrollHandler);  </script>  </body>  
</html>

演示

补充:

时间戳版
  • 原理:通过比较当前时间和上一次执行函数的时间戳,来判断是否达到指定的时间间隔。
  • 示例代码
function throttle(func, wait) {  let previous = 0;  return function() {  let now = Date.now();  let context = this;  let args = arguments;  if (now - previous > wait) {  func.apply(context, args);  previous = now;  }  }  
}  // 使用方法  
content.onmousemove = throttle(count, 1000); // 每1秒执行一次count函数
使用lodash库
  • 示例代码
html复制代码<script src="./lodash.min.js"></script>  
<script>  const box = document.querySelector('.box');  let i = 1;  function mouseMove() {  box.innerHTML = i++; // 如果里面存在大量操作DOM的情况,可能会卡顿  }  box.addEventListener('mousemove', _.throttle(mouseMove, 500)); // 每500毫秒执行一次mouseMove函数  
</script>

节流防抖的区别

节流throttle指定的delay时间内只被调用一次,即使它被频繁触发;

防抖debounce,只要触发,就重新计算delay;

这篇关于手写节流throttle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029109

相关文章

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

JS手写实现深拷贝

手写深拷贝 一、通过JSON.stringify二、函数库lodash三、递归实现深拷贝基础递归升级版递归---解决环引用爆栈问题最终版递归---解决其余类型拷贝结果 一、通过JSON.stringify JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一 原理:利用JSON.stringify 将JavaScript对象序列化成为JSO

T1打卡——mnist手写数字识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.定义GPU import tensorflow as tfgpus=tf.config.list_physical_devices("GPU")if gpus:gpu0=gpus[0]tf.config.experimental.set_memort_groth(gpu0,True) #设置GPU现存用量按需

【DL--22】实现神经网络算法NeuralNetwork以及手写数字识别

1.NeuralNetwork.py #coding:utf-8import numpy as np#定义双曲函数和他们的导数def tanh(x):return np.tanh(x)def tanh_deriv(x):return 1.0 - np.tanh(x)**2def logistic(x):return 1/(1 + np.exp(-x))def logistic_derivati

【tensorflow CNN】构建cnn网络,识别mnist手写数字识别

#coding:utf8"""构建cnn网络,识别mnistinput conv1 padding max_pool([2,2],strides=[2,2]) conv2 x[-1,28,28,1] 卷积 [5,5,1,32] -> [-1,24,24,32]->[-1,28,

【tensorflow 全连接神经网络】 minist 手写数字识别

主要内容: 使用tensorflow构建一个三层全连接传统神经网络,作为字符识别的多分类器。通过字符图片预测对应的数字,对mnist数据集进行预测。 # coding: utf-8from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfimport matplotlib.pyplot

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装,signature_pad本身是web端的插件,此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Released

前端防抖和节流函数的实现原理

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的优化技术,它们主要用于减少事件处理函数的执行频率,从而提高程序性能和用户体验。 防抖(Debounce) 防抖的目的是确保一个操作在一段时间内只被执行一次。例如,当用户在一个输入框中快速连续输入文字时,我们可能希望只在用户停止输入之后的一小段时间后再去执行查询操作,以避免频繁触发不必要的API调用。 实现原理: 设

手写全排列(递归 | 非递归)

博客搬家:最爱午后红茶 以下内容转自:点击打开链接 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,  如 abc 的全排列: abc, acb, bca, dac, cab, cba 一.全排列的递归实现 为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这