节流防抖:提升前端性能的秘密武器(上)

这篇具有很好参考价值的文章主要介绍了节流防抖:提升前端性能的秘密武器(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

节流防抖:提升前端性能的秘密武器(上),前端

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

一、引言

介绍节流防抖的概念和重要性

节流防抖是在 JavaScript 中常见的两种技术,用于限制某个函数在短时间内被频繁调用。

节流 是指在一定时间内,限制函数的调用次数,即如果函数在指定的时间内被调用,只有第一次调用会被执行,直到下一个指定的时间间隔才会再次执行。

防抖 是指在一定时间内,延迟函数的执行,即如果函数在指定的时间内被频繁调用,只会执行最后一次调用,之前的调用都会被取消。

这两种技术的重要性在于它们可以提高应用程序的性能和用户体验。例如,在搜索框输入时,如果每次输入一个字符就发送一个请求到服务器,可能会导致大量不必要的请求,从而降低应用程序的性能。使用节流或防抖技术可以限制请求的频率,减少服务器的负载,并提高用户体验。

另外,节流和防抖技术还可以用于其他场景,例如按钮提交、滚动事件处理等,以避免不必要的操作和提高应用程序的响应能力。

为什么需要节流防抖

需要使用节流防抖的原因有以下几点:

  1. 性能优化:在一些场景中,频繁地执行某个函数可能会导致性能问题,例如在浏览器中进行 DOM 操作或发送网络请求。通过使用节流或防抖,可以限制函数的执行频率,减少不必要的计算和资源消耗,从而提高应用程序的性能

  2. 减少冗余操作:有时候,用户可能会在短时间内快速触发同一个事件多次,而实际上只需要最后一次触发的操作被执行。例如,在搜索框中输入文字时,用户可能会连续输入多个字符,但只需要最后输入的内容进行搜索。通过使用节流或防抖,可以避免执行之前的冗余操作,只执行最后一次触发的操作。

  3. 提升用户体验:在某些情况下,频繁的操作可能会给用户带来不好的体验,例如在输入框中输入文字时,如果每次输入一个字符就发送一个请求到服务器,可能会导致页面卡顿或响应延迟。通过使用节流或防抖,可以减少这种不必要的操作,提高用户输入的流畅度和响应速度。

综上所述,节流防抖是一种用于优化性能、减少冗余操作和提升用户体验的技术手段,在需要限制某个函数的执行频率或避免短时间内多次触发同一个事件的场景中非常有用。

二、节流防抖的原理

解释节流和防抖的基本原理

节流 的基本原理是在指定的时间间隔内,只允许函数被调用一次。如果函数在该时间间隔内被再次调用,那么只有第一次调用会被执行,其他调用都会被忽略。直到时间间隔过去后,才会执行下一次调用。

以下是一个简单的节流示例代码:

function throttle(func, delay) {
  // 使用 flag 来记录上次执行时间
  let flag = true; 

  return function() {
    if (flag) {
      flag = false;
      setTimeout(() => {
        func.apply(this, arguments);
        flag = true;
      }, delay);
    }
  };
}

在上述代码中,throttle 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时检查 flag 的状态。如果 flagtrue,表示上次调用还在时间间隔内,那么本次调用将被忽略。如果 flagfalse,表示上次调用已经过去了时间间隔,那么会执行 func 函数,并将 flag 设为 true。然后,使用 setTimeout 延迟一段时间后再次将 flag 设为 false,以便下一次调用可以执行。

防抖 的基本原理是将多个连续的函数调用合并为一个,只在最后一次调用后执行函数。如果在指定的时间间隔内再次触发事件,之前的延迟操作会被取消,重新开始计时。

以下是一个简单的防抖示例代码:

function debounce(func, delay) {
  let debounceTimer; 

  return function() {
    // 清除之前设置的定时器
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

在上述代码中,debounce 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时清除之前设置的定时器,并重新设置一个定时器。只有在定时器到期后,才会执行 func 函数。

通过使用节流和防抖,可以有效地限制某个函数在短时间内被频繁调用,从而提高应用程序的性能和用户体验。

二者的实现方式和应用场景

以下是二者实现方式和应用场景的详细解释:

  1. 节流
  • 实现方式:节流通过控制函数在指定的时间间隔内只执行一次来实现。当函数被调用时,它会检查上一次执行的时间,如果距离上次执行时间小于时间间隔,就会忽略本次调用。否则,它会执行函数,并重新开始计时。

  • 应用场景:节流适用于需要限制某个操作执行频率的场景。例如,在搜索框输入时,每次按键都会发送一个请求到服务器进行搜索。使用节流可以将请求合并为每隔一段时间发送一次,避免频繁请求导致的性能问题。

  1. 防抖
  • 实现方式:防抖通过延迟函数的执行来实现。当函数被调用时,它会启动一个定时器。如果在定时器到期前函数再次被调用,它会重置定时器并重新开始计时。只有当定时器到期且期间没有再次调用函数时,才会执行函数。

  • 应用场景:防抖适用于需要在用户操作结束后执行某个操作的场景。例如,在提交表单时,用户可能会连续点击提交按钮多次,但只希望最后一次点击提交数据。使用防抖可以确保只有最后一次点击会触发提交操作。

总的来说,节流和防抖都是用于优化性能和用户体验的技术。它们的主要区别在于节流是限制函数的执行频率,而防抖是延迟函数的执行直到用户停止操作。选择使用哪种技术取决于具体的需求和场景。

三、使用 JavaScript 实现节流防抖

简单的示例代码

以下是使用 JavaScript 实现节流防抖的简单示例代码:

  1. 节流
// 创建一个节流函数
function throttle(func, delay) {
 // 使用 flag 来记录上次执行时间
 let flag = true; 

 return function() {
 if (flag) {
 flag = false;
 // 使用 setTimeout 延迟执行
 setTimeout(() => {
 func.apply(this, arguments);
 flag = true;
 }, delay);
 }
 }
}

// 创建一个测试函数
const exampleFunction = () => {
 console.log('函数执行!');
}

// 使用节流函数包装测试函数
const throttledFunction = throttle(exampleFunction, 1000);

// 调用节流后的函数
throttledFunction();
throttledFunction();
throttledFunction();

在上述示例中,throttle 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时检查 flag 的状态。如果 flagtrue,表示上次调用还在时间间隔内,那么本次调用将被忽略。如果 flagfalse,表示上次调用已经过去了时间间隔,那么会执行 func 函数,并将 flag 设为 true。然后,使用 setTimeout 延迟一段时间后再次将 flag 设为 false,以便下一次调用可以执行。

  1. 防抖
// 创建一个防抖函数
function debounce(func, delay) {
 let debounceTimer; 

 return function() {
 const context = this;
 const args = arguments; 

 // 清除之前设置的定时器
 clearTimeout(debounceTimer);
 debounceTimer = setTimeout(() => {
 func.apply(context, args);
 }, delay);
 }
}

// 创建一个测试函数
const exampleFunction = () => {
 console.log('函数执行!');
}

// 使用防抖函数包装测试函数
const debouncedFunction = debounce(exampleFunction, 1000);

// 调用防抖后的函数
debouncedFunction();
debouncedFunction();
debouncedFunction();

在上述示例中,debounce 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时清除之前设置的定时器,并重新设置一个定时器。只有在定时器到期后,才会执行 func 函数。

通过使用节流和防抖,可以有效地限制某个函数在短时间内被频繁调用,从而提高应用程序的性能和用户体验。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行一些调整和优化。文章来源地址https://www.toymoban.com/news/detail-757055.html

到了这里,关于节流防抖:提升前端性能的秘密武器(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 性能优化---节流与防抖

    1、什么是节流和防抖         防抖是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。这可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求。         节流是指规定一个单位时间,在这个单位时间内,只

    2024年04月17日
    浏览(40)
  • ChatGPT: 提升程序员开发效率的秘密武器!

    在现代软件开发中,时间和效率显得尤为重要。程序员们需要在尽可能短的时间内编写高质量的代码,并使之处于状态良好的维护周期。为满足这些需求,人工智能技术逐渐成为软件开发的一项核心能力。ChatGPT作为自然语言生成模型中的佼佼者,为程序员们提供了一个全新的

    2024年02月13日
    浏览(48)
  • 前端刷题-防抖节流

    在实际的开发过程中,一般会使用lodash自有的debounce函数和throttle函数对所要防抖/节流的函数进行包裹。例如

    2024年02月10日
    浏览(43)
  • 前端优化 ----防抖 节流

    如果一个事件在短时间内连续触发,则只去执行最后一次。 控制频率 实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法 缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟 使一个函数在固定时间内只执行一次。控制

    2024年02月04日
    浏览(40)
  • 【前端】防抖和节流原理+实现

    防抖(Debounce)和节流(Throttle)都是用于控制函数执行频率的机制,它们在处理高频触发的事件时非常有用。 防抖的原理是在事件被触发后,等待一段时间(例如200毫秒)来执行函数,如果在等待时间内事件被再次触发,则重新计时。这样可以避免在短时间内多次触发事件

    2024年04月16日
    浏览(38)
  • 前端解决按钮重复提交数据问题(节流和防抖)

    🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿 🍟欢迎来到前端初见的博文,本文主要讲解在工作解决按钮重复提交数据问题(节流和防抖) 👨‍🔧 个人主页 : 前端初见 🥞喜欢的朋友可以关注一下,下次更新不迷路🥞 当我们在页面进行点点点的操作时,很可能遇到点击两次的行为,

    2024年02月09日
    浏览(72)
  • 前端常见面试题之防抖、节流、xss、xsrf

    输入URL :在浏览器的地址栏中输入要访问的网站的URL(统一资源定位符)。 DNS解析 :浏览器会将URL发送给DNS服务器,DNS服务器负责将URL解析为对应的IP地址。 建立TCP连接 :浏览器会根据解析得到的IP地址,使用TCP(传输控制协议)与服务器建立连接。 发起HTTP请求 :TCP连接

    2024年01月19日
    浏览(46)
  • 100%硬核解决前端复杂动画的秘密武器!

    哈喽!大家好!我是程序视点的小二哥。 前端开发中,总会遇到这样一个困境: 动画还原 。对于前端开发工程师,有的是这样做的。 照着设计动画模仿,猜测动画时长,手创建贝塞尔曲线…… 调整细节耗时耗力,效果还差强人意... 好不容易实现了,还原度却达不到要求

    2024年02月04日
    浏览(52)
  • 前端面试题-js-new关键字-this指向-js事件流-防抖节流

    1.创建一个简单的空对象 2.原型的绑定,确定对象O的原型链 3.绑定this对象为O,传入参数;执行Person构造函数,进行属性和方法的赋值操作 4.返回结果 普通函数的this指向 函数的this指向有一个基本的原则,谁调用的函数,函数的this就指向谁,否则指向全局 箭头函数的this指向

    2024年01月25日
    浏览(48)
  • Python中的迭代器与生成器提高性能的秘密武器【第143篇—迭代器与生成器】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程中,迭代器和生成器是提高性能和减少内存消耗的重要工具。它们不仅简化了代码结构,而且在处理大型数据集时具有明显的优势

    2024年03月24日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包