当前位置: 首页 > news >正文

javascript 性能优化实例一则

减少重绘和回流

在JavaScript中,频繁操作DOM会导致浏览器重绘和回流,影响性能。可以通过合并DOM操作或使用文档片段(DocumentFragment)来减少重绘和回流次数。

// 低效方式:多次操作DOM
for (let i = 0; i < 100; i++) {document.body.appendChild(document.createElement('div'));
}// 高效方式:使用文档片段
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {fragment.appendChild(document.createElement('div'));
}
document.body.appendChild(fragment);

使用事件委托

事件委托利用事件冒泡机制,将事件处理程序绑定到父元素而非每个子元素,减少内存消耗和事件绑定时间。

// 低效方式:为每个子元素绑定事件
document.querySelectorAll('li').forEach(li => {li.addEventListener('click', () => {console.log(li.textContent);});
});// 高效方式:事件委托
document.querySelector('ul').addEventListener('click', (e) => {if (e.target.tagName === 'LI') {console.log(e.target.textContent);}
});

避免频繁操作样式

直接修改元素的style属性会导致多次回流。可以通过添加或移除CSS类名来批量修改样式。

// 低效方式:直接修改style
element.style.width = '100px';
element.style.height = '200px';
element.style.backgroundColor = 'red';// 高效方式:使用CSS类名
element.classList.add('active');

使用节流和防抖

对于频繁触发的事件(如scroll、resize),使用节流(throttle)或防抖(debounce)技术减少事件处理函数的执行频率。

// 防抖实现
function debounce(func, delay) {let timer;return function() {clearTimeout(timer);timer = setTimeout(() => func.apply(this, arguments), delay);};
}window.addEventListener('resize', debounce(() => {console.log('Resize event handled');
}, 200));// 节流实现
function throttle(func, limit) {let inThrottle;return function() {if (!inThrottle) {func.apply(this, arguments);inThrottle = true;setTimeout(() => inThrottle = false, limit);}};
}window.addEventListener('scroll', throttle(() => {console.log('Scroll event handled');
}, 100));

优化循环性能

在循环中避免重复计算或访问DOM,可以通过缓存变量或减少循环次数提升性能。

// 低效方式:重复访问DOM
for (let i = 0; i < document.querySelectorAll('div').length; i++) {console.log(document.querySelectorAll('div')[i].textContent);
}// 高效方式:缓存DOM查询结果
const divs = document.querySelectorAll('div');
const length = divs.length;
for (let i = 0; i < length; i++) {console.log(divs[i].textContent);
}

使用Web Workers处理耗时任务

将耗时任务(如大数据处理)放到Web Worker中执行,避免阻塞主线程。

// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage({ data: largeArray });
worker.onmessage = (e) => {console.log('Result:', e.data);
};// worker.js
self.onmessage = (e) => {const result = e.data.data.map(processData);self.postMessage(result);
};

合理使用缓存

对于重复计算或请求的数据,使用缓存机制避免重复处理。

const cache = {};
function expensiveOperation(key) {if (cache[key]) {return cache[key];}const result = /* 复杂计算 */;cache[key] = result;return result;
}

http://www.dtcms.com/a/464837.html

相关文章:

  • mapbox基础,使用矢量切片服务(pbf)加载line线图层
  • LLVM(Low Level Virtual Machine)介绍
  • Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
  • HDLBit 个人记录
  • 基于Jetson+FPGA+GMSL+AI的自动驾驶数据采集解决方案
  • 0006.C#学习笔记3-- HTML和CSS
  • 基于X86+FPGA+GPU的自动驾驶数据回灌测试解决方案
  • 在JavaScript / HTML中,Chrome报错Refused to execute inline script
  • 自动驾驶的“虚拟驾校”如何炼成?
  • 自动驾驶传感器数据录制过程中的五大系统性挑战
  • 学校网站建设开题报告书wordpress 发布说说
  • 企业如何减少由于数据不一致带来的运营成本?
  • 安卓开发APP应用程序和苹果iOS开发APP应用程序有什么区别?
  • Mac 上用 Homebrew 安装 JDK 8(适配 zsh 终端)完整教程
  • 利用小偷程序做网站企业网站开发建设
  • K8S基本命令操作
  • 【kubernetes/k8s源码分析】kube-controller-manager之node controller源码分析
  • SMOTE 算法详解:解决不平衡数据问题的有效工具
  • HGDB集群(安全版)repmgr手动切换主备库
  • 三维GIS数据转换指南:SHAPE文件到3DTiles的高效实现方案
  • K8S(三)—— 基于kubeadm 1.20版本部署Kubernetes集群与Harbor私有仓库实战
  • 宁波外贸网站制作公司手机网站建设哪家公司好
  • 【C语言实战(8)】C语言循环结构(do-while):解锁编程新境界
  • 面向Qt/C++开发工程师的Ai提示词(附Trae示例)
  • sqlite 使用: 01-源码编译与使用
  • Django视图进阶:快捷函数、装饰器与请求响应
  • 企业营销网站的建设网站开发响应式
  • 掌握DMA基于GD32F407VE的天空星的配置
  • 基于腾讯云的物联网导盲助手设计与实现(论文+源码)
  • Vue3打造高效前端埋点系统