引言
本质上来说,任何能提高运行效率,降低运行开销的行为,都可以算作性能优化的操作。对JS来说,我们可以从内存空间的使用、垃圾回收机制等方面进行优化。
一、减少重绘和回流
重绘和回流会消耗大量的计算资源。尽量避免在循环中修改样式属性或获取布局信息。
- 如果需要对多个样式进行修改,可以使用CSS的class切换
2. 减少Dom操作。频繁的DOM操作会导致重绘和重新布局,影响性能。建议将多个DOM操作合并为一个操作,或者使用DocumentFragment来批量操作
二、慎用全局变量
全局变量定义在全局执行上下文,是所有作用域链的顶端。每次查找的时候都从局部找到最顶端,在时间上会有所消耗。
全局执行上下文一直存在于上下文的执行栈,直到程序退出,才会被销毁,内存空间浪费
三、使用事件代理
将事件监听器绑定到父元素,利用事件冒泡机制来处理子元素的事件,可以减少事件处理函数的数量,提高性能。
四、使用节流与防抖
在处理一些高频触发的事件(如resize、scroll)时,使用节流(throttling)和防抖(debouncing)可以限制事件处理函数的执行频率,提高性能。
// 节流
function throttle(func, delay) {
let timerId;
return function (...args) {
if (!timerId) {
timerId = setTimeout(() => {
func(...args);
timerId = null;
}, delay);
}
};
}
// 防抖
function debounce(func, delay) {
let timerId;
return function (...args) {
clearTimeout(timerId);
timerId = setTimeout(() => {
func(...args);
}, delay);
};
}
// 使用节流处理scroll事件
window.addEventListener('scroll', throttle(handleScroll, 200));
// 使用防抖处理输入事件
input.addEventListener('input', debounce(handleInput, 300));
五、减少网络请求
减少HTTP请求次数可以显著提高页面加载速度。可以将多个脚本或样式表合并为单个文件,使用CSS Sprites技术来减少图片请求,使用CDN加速等。