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

JS 性能优化

1. 内存管理方案,内存泄露的造成

1.1 全局变量导致内存泄漏问题
使用全局变量可能会导致内存泄漏,因为它们在程序终止之前不会自动被垃圾回收
// 具有全局变量的内存泄漏示例
let globalArray = [];
function addToGlobalArray(item) {
  globalArray.push(item);
}

// 使用局部变量修复这个问题
function manageArray() {
  let localArray = [];
  function addToArray(item) {
    localArray.push(item);
  }
}
1.2 闭包引发的内存泄漏
即使外部函数已经返回,闭包仍可以保留对变量的引用,如果使用不当,可能会导致内存泄漏
// 闭包导致内存泄漏的场景
function outerFunction() {
  let largeArray = new Array(1000000).fill('data');
  return function innerFunction() {
    console.log(largeArray.length);
  }
}
const inner = outerFunction();
inner(); 

// 通过显示的清除方案,解决内存泄漏的问题
function outerFunction() {
  let largeArray = new Array(1000000).fill('data');
  return function innerFunction() {
    console.log(largeArray.length);
    largeArray = null; // 显示清除
  }
}
const inner = outerFunction();
inner();
1.3 事件监听导致内存泄漏问题
当不再需要事件监听器时未能删除它们可能会导致内存泄漏
// 事件监听器的可能会导致内存泄漏
function addEventListenerExample() {
  document.querySelector('button').addEventListener('click', function() {
    console.log('Button clicked');
  });
}

// 手动清除监听器
function addEventListenerExample() {
  const button = document.querySelector('button');
  const clickHandler = function() {
    console.log('Button clicked');
  }
  button.addEventListener('click', clickHandler);
  // 删除监听
  button.removeEventListener('click', clickHandler);
}
1.4 DOM 节点导致的内存泄漏
引用的已经删除的 DOM 节点可能会导致内存泄漏。当删除节点时,需要清理 DOM 引用
// DON 节点的引用
let element = document.createElement('div');
document.body.appendChild(element);
document.body.removeChild(element); // DOM 节点被删除

// 手动清理引用
element = nul

2. 优化数据结构

选择正确的数据结构会显著影响 JavaScript 应用程序的性能。高效的数据结构可以提高搜索、排序和操作数据等操作的速度和内存使用率
// 基于 Set 构建唯一值的集合
const uniqueValues = new Set([1, 2, 3, 4, 5, 5, 6]);
uniqueValues.add(7);
uniqueValues.delete(3);
console.log(uniqueValues.has(2)); // true
console.log(uniqueValues.size); // 6

// 基于 Map 构建 key-value 结构
const map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
console.log(map.get('key1')); // 'value1'
map.delete('key2');
console.log(map.size); // 1

http://www.kler.cn/news/310708.html

相关文章:

  • Linux Kernel Makefiles 编译标志详解
  • C++在Linux实现多线程和多进程的TCP服务器和客户端通信
  • 【公告】博客正在迁移至 git pages
  • RaisePropertyChanged(() => DateName)详解记录一下
  • 前端开发之迭代器模式
  • linux 解压缩
  • 用Python获取PDF页面的大小、方向和旋转角度
  • 75年来最强台风中,开门见“光明”!百年乳企守护城市“奶瓶子”,传递温度
  • 从HarmonyOS升级到HarmonyOS NEXT-环信SDK数据迁移
  • 2024年最新版Vue3学习笔记
  • Pandas语句
  • 【笔记】进制转换
  • Redis技术解析(基础篇)
  • spring boot 定时器配置
  • Qt中pro项目文件配置介绍
  • 智慧园区:解析集成运维的未来之路
  • 在 Windows 上恢复已删除的 PDF 文件的最佳方法
  • 基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测
  • 健康监测功能或暂缓亮相,Apple Watch Series 10最新爆料解析
  • DeepFaceLab训练技巧
  • WordPress建站钩子函数及使用
  • 大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择
  • 基于SpringBoot+Vue的网上书店
  • git bash中执行java命令乱码问题处理
  • Python基础(六)——PyEcharts数据可视化初级版
  • C语言 | Leetcode C语言题解之第414题第三大的数
  • java定时任务
  • QT----基于QML的计时器
  • 【算法】堆与优先级队列
  • shinyproxy部署R语言shiny APP