1. 减少重绘和回流
重绘和回流是性能开销大的操作,可以通过以下方式减少:
实例 - 批量修改样式
// 不推荐
for (let i = 0; i < 1000; i++) {
element.style.left = i + 'px';
}
// 推荐
element.style.left = '1000px';
实例 - 使用文档片段
// 不推荐
for (let i = 0; i < 1000; i++) {
document.body.innerHTML += '<div>' + i + '</div>';
}
// 推荐
let fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
let div = document.createElement('div');
div.textContent = i;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
2. 缓存变量
避免多次访问相同的对象或属性,可以将其缓存起来。
实例 - 缓存数组长度
// 不推荐
for (let i = 0; i < arr.length; i++) {
// 操作 arr[i]
}
// 推荐
for (let i = 0, len = arr.length; i < len; i++) {
// 操作 arr[i]
}
3. 使用事件委托
在父元素上监听事件,通过事件冒泡捕获子元素的事件,减少事件处理器的数量。
实例 - 使用事件委托
<!-- 不推荐 -->
<ul>
<li onclick="handleClick(1)">Item 1</li>
<li onclick="handleClick(2)">Item 2</li>
<li onclick="handleClick(3)">Item 3</li>
<!-- ... -->
</ul>
<!-- 推荐 -->
<ul id="myList">
<li data-id="1">Item 1</li>
<li data-id="2">Item 2</li>
<li data-id="3">Item 3</li>
<!-- ... -->
</ul>
<script>
document.getElementById('myList').addEventListener('click', function(event) {
if (event.target.tagName === 'LI') {
handleClick(event.target.dataset.id);
}
});
</script>
4. 使用 Web Worker
将一些计算密集型任务放到 Web Worker 中,以充分利用多线程。
实例 - 使用 Web Worker
// main.js
let worker = new Worker('worker.js');
worker.onmessage = function(event) {
console.log('Received from worker:', event.data);
};
worker.postMessage('Hello from main!');
// worker.js
onmessage = function(event) {
console.log('Received from main:', event.data);
postMessage('Hello from worker!');
};
5. 使用节流和防抖
在处理频繁触发的事件(如滚动、调整窗口大小)时,可以使用节流和防抖来控制函数的执行频率。
实例 - 节流
function throttle(func, delay) {
let lastTime = 0;
return function() {
let currentTime = Date.now();
if (currentTime - lastTime >= delay) {
func.apply(this, arguments);
lastTime = currentTime;
}
};
}
window.addEventListener('scroll', throttle(function() {
console.log('Throttled scroll event');
}, 200));
实例 - 防抖
function debounce(func, delay) {
let timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(() => {
func.apply(this, arguments);
}, delay);
};
}
window.addEventListener('resize', debounce(function() {
console.log('Debounced resize event');
}, 200));
这些是一些简单的 JavaScript 性能优化小窍门。实际项目中,要根据具体情况和性能测试结果选择适合的优化方法。
转载请注明出处:http://www.pingtaimeng.com/article/detail/3585/JavaScript