JavaScript性能优化实战

news2026/2/27 14:13:32

### 1. 减少全局变量
JavaScript里,全局变量就像一个大杂烩,啥都往里扔,很容易出问题,还会影响性能。为啥呢?因为全局变量会被所有函数共享,查找起来特别费劲,就像在一个大仓库里找东西,每次都得翻个遍。

**优化方法:**
尽量把变量定义在局部,用完就扔。比如,你在函数里用到的变量,就直接在函数里声明。这样,JavaScript引擎就能快速找到它,性能自然就上去了。

```javascript
// 不好的写法
var x = 10;
function add() {
    console.log(x + 20);
}

// 好的写法
function add() {
    var x = 10;
    console.log(x + 20);
}
```

### 2. 避免使用过多的嵌套函数
嵌套函数太多,就像套娃一样,一层套一层,不仅代码难读,性能也会大打折扣。为啥呢?因为每次调用函数,JavaScript引擎都要保存当前的状态,然后去执行嵌套的函数,等嵌套函数执行完再回来,这来回折腾,效率能高才怪。

**优化方法:**
能拆开的尽量拆开,把逻辑写得简单点。如果实在需要嵌套,尽量控制在两层以内。

```javascript
// 不好的写法
function outer() {
    function inner() {
        function innermost() {
            console.log("Hello");
        }
        innermost();
    }
    inner();
}

// 好的写法
function innermost() {
    console.log("Hello");
}
function inner() {
    innermost();
}
function outer() {
    inner();
}
```

### 3. 少用for-in循环
for-in循环看起来很酷,能遍历对象的所有属性,但问题是,它会遍历对象的原型链上的属性,这就容易出问题,而且效率也不高。

**优化方法:**
如果只是想遍历数组,就用普通的for循环或者`for-of`循环。如果是对象,可以用`Object.keys()`或者`Object.values()`来遍历。

```javascript
// 不好的写法
var obj = {a: 1, b: 2, c: 3};
for (var key in obj) {
    console.log(key, obj[key]);
}

// 好的写法
var obj = {a: 1, b: 2, c: 3};
Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});
```

### 4. 缓存DOM查询结果
DOM操作是很耗性能的,尤其是频繁地查询DOM元素。每次调用`document.getElementById`或者`document.querySelector`,浏览器都要去页面里找对应的元素,这要是频繁操作,页面肯定卡得不行。

**优化方法:**
把查询到的DOM元素存起来,下次用的时候直接用,不用再重新查询。

```javascript
// 不好的写法
function changeText() {
    document.getElementById("myElement").innerText = "Hello";
}

// 好的写法
var myElement = document.getElementById("myElement");
function changeText() {
    myElement.innerText = "Hello";
}
```

### 5. 减少重绘和重排
重绘和重排是浏览器的两个耗时操作。重排就是重新计算页面布局,重绘就是重新绘制页面。比如,你频繁地修改元素的样式或者位置,浏览器就得不停地重新计算和绘制页面。

**优化方法:**
尽量批量修改样式,减少对DOM的操作次数。比如,把多个样式修改放在一个`style`属性里,或者用`classList`来切换样式类。

```javascript
// 不好的写法
var element = document.getElementById("myElement");
element.style.width = "100px";
element.style.height = "100px";
element.style.backgroundColor = "red";

// 好的写法
var element = document.getElementById("myElement");
element.style.cssText = "width: 100px; height: 100px; background-color: red;";
```

### 6. 使用事件委托
如果你有一个列表,每个列表项都需要绑定事件,直接给每个列表项绑定事件,那效率肯定低得不行。因为每个元素都要绑定一个事件处理器,这不仅浪费内存,还会影响性能。

**优化方法:**
用事件委托,把事件绑定到父元素上。当事件触发时,通过事件冒泡机制,父元素会捕获到事件,然后根据目标元素来判断怎么做。

```javascript
// 不好的写法
var items = document.querySelectorAll(".item");
items.forEach(function(item) {
    item.addEventListener("click", function() {
        console.log("Item clicked");
    });
});

// 好的写法
var list = document.getElementById("myList");
list.addEventListener("click", function(event) {
    if (event.target.classList.contains("item")) {
        console.log("Item clicked");
    }
});
```

### 7. 压缩和合并代码
如果你的项目有很多JavaScript文件,每个文件都要单独加载,那页面加载速度肯定慢得不行。而且,代码里可能还有好多不必要的空格、注释之类的,这些都会增加文件大小。

**优化方法:**
用工具把多个JavaScript文件合并成一个文件,然后压缩代码,去掉多余的空格和注释。这样,浏览器加载的时候就快多了。

### 8. 使用异步加载
有时候,你的JavaScript文件特别大,或者依赖的资源特别多,页面加载的时候就会卡住。因为浏览器会先加载JavaScript文件,等文件加载完并执行完后,才会继续加载页面的其他内容。

**优化方法:**
用异步加载的方式,让JavaScript文件在后台加载,页面先加载其他内容。比如,可以用`defer`或者`async`属性。

```html
<script src="script.js" defer></script>
```

### 9. 减少不必要的计算
代码里有时候会有一些不必要的计算,比如重复的数学运算、多余的逻辑判断之类的。这些虽然看起来没啥影响,但积累起来就会拖慢代码的运行速度。

**优化方法:**
仔细检查代码,把不必要的计算去掉。比如,能用变量存储结果的,就不要每次都重新计算。

```javascript
// 不好的写法
for (var i = 0; i < array.length; i++) {
    console.log(array[i] * 2);
}

// 好的写法
var length = array.length;
for (var i = 0; i < length; i++) {
    console.log(array[i] * 2);
}
```

### 10. 使用Web Workers
如果有些计算特别复杂,比如数据处理、加密解密之类的,直接在主线程里运行,页面肯定卡得不行。因为主线程既要处理页面的渲染,又要处理这些复杂的计算,忙不过来。

**优化方法:**
用Web Workers,把复杂的计算放到后台线程里运行,主线程只负责页面的渲染。这样,页面就不会卡住了。

```javascript
// 主线程
var worker = new Worker("worker.js");
worker.postMessage("Hello");

worker.onmessage = function(event) {
    console.log("Message from worker:", event.data);
};

// worker.js
self.onmessage = function(event) {
    console.log("Message from main thread:", event.data);
    self.postMessage("Hello from worker");
};
```

### 总结
JavaScript性能优化其实没那么难,关键是要养成好习惯。少用全局变量、减少嵌套函数、缓存DOM查询结果、使用事件委托、异步加载……这些方法都很实用,而且不难做到。只要你把这些小技巧用起来,你的代码运行速度肯定会有很大提升,网页也能流畅得飞起来!

好啦,今天的分享就到这里啦!如果你觉得有用,别忘了点赞和分享哦!下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

1 、 API 分类特征 SOAP - WSDL OpenApi - Swagger RESTful - /v1/api/ 2 、 API 常见漏洞 OWASP API Security TOP 10 2023 3 、 API 检测流程 接口发现&#xff0c;遵循分类&#xff0c;依赖语言&#xff0c; V1/V2 多版本等 Method &#xff1a;请求方法 攻击方…

视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线

一、背景分析​ 1&#xff09;政策监管刚性需求​&#xff1a;国家食品安全战略及 2024年《关于深化智慧城市发展的指导意见》要求构建智慧餐饮场景&#xff0c;推动数字化监管。多地将“AI明厨亮灶”纳入十四五规划考核&#xff0c;要求餐饮单位操作可视化并具备风险预警能力…

仓库自动化搬运:自动叉车与AGV选型要点及核心技术解析

自动叉车与AGV均可实现自主作业&#xff0c;无需人工驾驶即可搬运托盘化货物。然而&#xff0c;这两种解决方案存在一些关键差异。 自动叉车与AGV的对比 自动叉车与AGV是截然不同的车辆&#xff0c;其差异主要源于原始设计&#xff1a; 自动叉车是制造商对传统手动叉车进行改…

NLP学习路线图(二十五):注意力机制

在自然语言处理领域&#xff0c;序列模型一直扮演着核心角色。从早期的循环神经网络&#xff08;RNN&#xff09;到如今一统天下的Transformer模型&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09; 的引入堪称一场革命。它彻底改变了模型处理序列信息的方式…

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码&#xff1a; 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码&#xff1a; 执行手势操作&#xff1a; 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…

[AI绘画]sd学习记录(一)软件安装以及文生图界面初识、提示词写法

目录 目录一、安装软件二、文生图各部分模块 1. 下载新模型 & 画出第一张图2. 提示词输入 2.1 设置2.2 扩展模型2.3 扩展模型权重调整2.4 其他提示词输入2.5 负向提示词2.6 生成参考 3. 采样方法4. 噪声调度器5. 迭代步数6. 提示词引导系数 一、安装软件 软件安装&…

SpringBoot(八) --- SpringBoot原理

目录 一、配置优先级 二、Bean的管理 1. Bean的作用域 2. 第三方Bean 三、SpringBoot原理 1. 起步依赖 2. 自动配置 3. 自动配置原理分析 3.1 源码解析 3.2 Conditional 一、配置优先级 SpringBoot项目当中支持三类配置文件&#xff1a; application.properties a…

C# 类和继承(抽象成员)

抽象成员 抽象成员是指设计为被覆写的函数成员。抽象成员有以下特征。 必须是一个函数成员。也就是说&#xff0c;字段和常量不能为抽象成员。必须用abstract修饰符标记。不能有实现代码块。抽象成员的代码用分号表示。 例如&#xff0c;下面取自一个类定义的代码声明了两个抽…

鸿蒙仓颉语言开发实战教程:商城登录页

听说Pura80要来了&#xff1f;感觉华为的新品像下饺子一样&#xff0c;让人目不暇接&#xff0c;每隔几天就有发布会看&#xff0c;真不错呀。 节后第一天&#xff0c;为了缓解大家假期的疲惫&#xff0c;咱们今天做点简单的内容&#xff0c;就是商城的登录页面。 其实这一次分…

JavaScript 数组与流程控制:从基础操作到实战应用

在 JavaScript 编程的世界里&#xff0c;数组是一种极为重要的数据结构&#xff0c;它就像是一个有序的 “收纳盒”&#xff0c;能够将多个值整齐地存储起来。而流程控制语句则像是 “指挥官”&#xff0c;能够按照特定的逻辑对数组进行遍历和操作。接下来&#xff0c;就让我们…

SkyWalking架构深度解析:分布式系统监控的利器

一、SkyWalking概述 SkyWalking是一款开源的APM(应用性能监控)系统&#xff0c;专门为微服务、云原生和容器化架构设计。它由Apache软件基金会孵化并毕业&#xff0c;已成为分布式系统监控领域的明星项目。 核心特性 ‌分布式追踪‌&#xff1a;跨服务调用链路的完整追踪‌服务…

vue2中的render函数

<script> export default {components: {},name: "renderElems",render (h, context) {return this.$attrs.vnode;},updated() {} } </script> <style scoped> </style>分析一下上面.vue组件&#xff1a; 组件结构&#xff1a; 这是一个非…

PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献

Title 题目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE&#xff1a;用于新生儿缺氧缺血性脑病&#xff08;HIE&#xff09;疾病识别与分割的个性化和区域适应性方法 1 文献速递介绍 缺氧缺血性脑病&…

WordPress子主题RiPro-V5van无授权全开源版(源码下载)

WordPress子主题RiPro-V5van无授权全开源版&#xff0c;直接上使用方法:WordPress后台上传就行 这个主题是1.0版本开源的&#xff0c;有能力的可以二次开发一下加一些自己喜欢的功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/90952148 更多资…

StoreView SQL,让数据分析不受地域限制

作者&#xff1a;章建&#xff08;处知&#xff09; 引言 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】&#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0c…

UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)

UCRT 和 MSVC 是与 Windows 平台上 C/C 开发相关的两个重要概念&#xff0c;它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。 一、UCRT&#xff08;Universal C Runtime&#xff09; 1. 含义&#xff1a; UCRT&#xff08;Universal C …

rabbitmq Fanout交换机简介

给每个服务创建一个队列&#xff0c;然后每个业务订阅一个队列&#xff0c;进行消费。 如订单服务起个多个服务&#xff0c;代码是一样的&#xff0c;消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了

JAVA-springboot JUnit单元测试

SpringBoot从入门到精通-第9章 JUnit单元测试 一、JUnit与单元测试 JUnit是一个开源的测试框架&#xff0c;虽然可以用于测试大多数编程语言的应用程序&#xff0c;但特别适合用于测试Java语言的应用程序。 软件测试一般分为4个阶段&#xff0c;即单元测试、集成测试、系统测…

PyCharm中运行.py脚本程序

1.最近在弄一个python脚本程序&#xff0c;记录下运行过程。 2.编写的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI&#xff1a;传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …