防抖(Debounce)和节流(Throttle)是两种前端开发中常用的性能优化技术,尤其在处理高频触发事件如滚动、调整窗口大小、输入等场景中。传统实现这些功能需要编写复杂的函数,但随着JavaScript的发展,我们现在可以通过更简洁的方式实现这些功能。

传统实现方式回顾

在深入新特性之前,让我们先回顾一下传统的防抖和节流实现方式:

传统防抖实现

 
function debounce(fn, delay) {
let timer = null;
returnfunction(...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
} // 使用示例
const handleSearch = debounce(function(e) {
console.log('搜索内容:', e.target.value);
}, 300); searchInput.addEventListener('input', handleSearch);

传统节流实现

function throttle(fn, delay) {
let lastTime = 0;
returnfunction(...args) {
const now = Date.now();
if (now - lastTime >= delay) {
fn.apply(this, args);
lastTime = now;
}
};
} // 使用示例
const handleScroll = throttle(function() {
console.log('页面滚动');
}, 200); window.addEventListener('scroll', handleScroll);
 

JavaScript新特性:函数装饰器

ECMAScript的提案中引入了函数装饰器(Function Decorators),这是一种能够在不修改原始函数的情况下增强函数行为的语法。

注意:截至2024年10月,函数装饰器仍处于TC39提案阶段,可能需要通过Babel或TypeScript等工具进行转译才能使用。

利用装饰器实现一行防抖

现代化解决方案

使用requestAnimationFrame实现的节流

浏览器的requestAnimationFrameAPI可以帮助我们实现一行代码的节流效果:

利用AbortController实现简洁防抖

使用Web Streams API实现防抖节流

随着Web Streams API的成熟,我们可以利用它实现更声明式的防抖和节流:

第三方库的超简化方案

如果您使用诸如Lodash、Underscore等工具库,防抖节流变得极其简单:

// Lodash
import { debounce, throttle } from 'lodash';

// 一行防抖
element.addEventListener('input', _.debounce(handleInput, 300));

// 一行节流
window.addEventListener('scroll', _.throttle(handleScroll, 200));

实际应用场景

  1. 搜索输入框:防抖可以避免用户每输入一个字符就发送请求

  2. 窗口调整:节流可以限制布局重新计算的频率

  3. 无限滚动:节流可以控制加载新内容的频率

  4. 游戏中的用户输入:确保按键响应不会过于频繁

  5. 拖拽元素:平滑拖拽效果而不造成性能问题

性能比较

实现方式 优点 缺点
传统函数封装 兼容性好,灵活性高 代码冗长,需要手动管理
装饰器 语法简洁,声明式编程 兼容性问题,需要转译
requestAnimationFrame 与浏览器渲染周期同步,性能好 只适用于视觉相关操作
AbortController 清晰地管理取消机制 相对新的API,可能需要polyfill
Web Streams 声明式,功能强大 API复杂,兼容性有限
第三方库 简单,经过测试 增加项目依赖和体积

JavaScript的发展让我们能够用越来越简洁的代码实现防抖和节流功能。根据项目需求和浏览器兼容性要求,可以选择最适合的实现方式。对于现代web应用,装饰器和最新的Web API提供了简洁优雅的解决方案;而对于需要广泛兼容的项目,传统实现或借助成熟的第三方库仍然是可靠的选择。

无论选择哪种方式,防抖和节流都是提升用户体验和应用性能的重要技术,值得每位前端开发者掌握。

 
 
 
 

一行代码搞定防抖节流:JavaScript新特性解析的更多相关文章

  1. 一行代码搞定Adapter

    15年Google I/O大会发不了三个重要支持库 >Material design (Android Support Design) >百分比布局:Percent support lib ...

  2. Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper

    Asp.Net Core 轻松学-一行代码搞定文件上传   前言     在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建 ...

  3. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  4. 一行代码搞定所有屏幕适配AbViewUtil

    适配原理:抛弃google提供的dip理论与多套图片与布局方案,采用与UI设计师通用的px作为标准单位,原理是将UI设计师的设计图与当前查看的手机或其他设备的屏幕像素尺寸进行换算,得到缩放比例,在Ac ...

  5. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  6. 【springboot+easypoi】一行代码搞定excel导入导出

    原文:https://www.jianshu.com/p/5d67fb720ece 开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事 ...

  7. easypoi 一行代码搞定excel导入导出

    开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子[easypoi],下面介绍下“轮子”的使用. pom ...

  8. 一行代码搞定WordPress面包屑导航breadcrumb

    有好几位网友在问WordPress面包屑导航breadcrumb怎么操作,网上有些教程是去function文件中定义,其实不用那么复杂,很简单一行代码就能搞定.下面随ytkah一起来看看.如果是单页, ...

  9. 初识sa-token,一行代码搞定登录授权!

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  10. SnackbarUtils:一行代码搞定Snackbar

    此文章是我在简书的文章 http://www.jianshu.com/p/f4ba05d7bbda Snackbar在Android中的使用日益广泛,很大程度上替代了传统的Toast,相比Toast拥 ...

随机推荐

  1. 用 Facebook Hydra 参数配置框架来简化程序配置

    用 Facebook Hydra 参数配置框架来简化程序配置 目录 用 Facebook Hydra 参数配置框架来简化程序配置 0x00 摘要 0x01 问题描述 0x02 概述 0x03 使用 3 ...

  2. [记录点滴] Spark迁移到Flink的几个点

    [记录点滴] Spark迁移到Flink的几个点 0x00 三个问题点 有三个Spark API需要找到对应的Flink API或者替代方法 reduceByKeyAndWindow 函数reduce ...

  3. Linux安装hive

    1.需要先安装hadoop以及mysql,参考其他文章 安装hive和hadoop都在hadoop用户目录下 2.安装hive,之前,先在mysql上创建一个hive,数据库,并在hive数据库中建立 ...

  4. Python构建包、上传包详细步骤

    1.从git上拉取最新的代码 2.在当前项目目录中创建setup.py文件 setup.py 1 # coding: utf-8 2 ​ 3 """打包 4 " ...

  5. (自适应手机端)合同模板网站源码 合同范文类网站pbootcms模板

    PbootCMS内核开发的网站模板,该模板适用于合同范文网站.合同模板网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可: pc+wap,同一个后台,数据即时同步,简单适用!附带测试 ...

  6. Azure - [01] 订阅管理

    题记部分 001 || 核心功能 (1)访问控制   Azure订阅通过基于角色的访问控制(RBAC)系统,允许管理员精细管理用户.组和应用程序对资源的访问权限.RBAC系统通过将权限分配给角色,再将 ...

  7. TDH - 如何显示Guardian Client角色

    注意:本博客适用TDH版本4.3.x 默认该页面的 Guardian Client 是隐藏的,如果需要对 Guardian Client角色进行什么操作的话,需要先将 Guardian Client角 ...

  8. 面试题54. 二叉搜索树的第k大节点

    地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ <?php /** 面试题54. ...

  9. 探秘Transformer系列之(9)--- 位置编码分类

    探秘Transformer系列之(9)--- 位置编码分类 目录 探秘Transformer系列之(9)--- 位置编码分类 0x00 概述 0x01 区别 1.1 从直观角度来看 1.2 从模型处理 ...

  10. pandas表格数据-删除/赋值/字符串包含等

    官网:https://www.pypandas.cn/docs/ 1.删除某一固定列 del df['列名'] 删除某列某部分内容,以.str[0]取值 df['开始时间']=df['开始时间'].s ...