const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const div = document.createElement('div');
div.textContent = i;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
或者干脆把 HTML 拼成字符串,最后一次性 innerHTML 插入,性能能提几个数量级。
至于变量声明,现在 ES6+ 里用 let / const 是没错,但对性能影响微乎其微——浏览器引擎早就对这种语法糖优化得飞起了,你这点循环根本触发不了 JIT 的热点优化瓶颈。真要卡,八成是 I/O(这里 DOM 就是 I/O)拖的后腿。
顺带说一句,如果这玩意真要服务端渲染,直接后端生成 HTML 片段返回,前端直接 innerHTML 塞进去,连 DOM 创建都省了,体验立马丝滑。
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const div = document.createElement('div');
div.textContent = i;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
var/let/const上,而是你在循环里频繁操作 DOM。每次
document.body.appendChild(div)都会触发浏览器的重排(reflow)和重绘(repaint),1000 次就是 1000 次重排重绘,CPU 和 GPU 都得累死。你就算把变量全改成const,甚至用Object.create(null)创建对象,只要 DOM 操作还在循环里逐个插,卡顿就躲不掉。真正要做的优化是:批量操作 DOM。比如先用文档碎片
DocumentFragment把所有元素挂上去,最后一次性插进页面:或者干脆把 HTML 拼成字符串,最后一次性
innerHTML插入,性能能提几个数量级。至于变量声明,现在 ES6+ 里用
let/const是没错,但对性能影响微乎其微——浏览器引擎早就对这种语法糖优化得飞起了,你这点循环根本触发不了 JIT 的热点优化瓶颈。真要卡,八成是 I/O(这里 DOM 就是 I/O)拖的后腿。顺带说一句,如果这玩意真要服务端渲染,直接后端生成 HTML 片段返回,前端直接
innerHTML塞进去,连 DOM 创建都省了,体验立马丝滑。用文档片段先存起来,最后一次性append,性能直接起飞。