setTimeout 零延迟的应用场景

setTimeout(fn, 0) 在实际开发中的使用场景

问题

setTimeout 的延迟参数设置为 0 时,有哪些实际应用场景?

解答

setTimeout(fn, 0) 会创建一个宏任务,虽然延迟为 0,但不会立即执行,而是在当前执行栈清空后执行。这个特性在以下场景中很有用:

等待 UI 渲染完成

当需要在 DOM 更新并渲染到屏幕后再执行某些操作时,可以使用零延迟:

// 更新 DOM
element.textContent = '新内容';

// 等待浏览器渲染后再执行
setTimeout(() => {
  // 此时 DOM 已经渲染完成
  const height = element.offsetHeight;
  console.log('渲染后的高度:', height);
}, 0);

调整任务执行顺序

将某些操作推迟到下一个事件循环,让其他同步代码或微任务先执行:

console.log('1');

setTimeout(() => {
  console.log('3');
}, 0);

Promise.resolve().then(() => {
  console.log('2');
});

// 输出顺序: 1 -> 2 -> 3

避免长时间阻塞

处理大量数据时,分批执行可以避免阻塞主线程:

function processLargeArray(array) {
  const batchSize = 100;
  let index = 0;

  function processBatch() {
    const end = Math.min(index + batchSize, array.length);
    
    for (let i = index; i < end; i++) {
      // 处理数据
      array[i] = array[i] * 2;
    }
    
    index = end;
    
    if (index < array.length) {
      setTimeout(processBatch, 0);
    }
  }
  
  processBatch();
}

关键点

  • setTimeout(fn, 0) 不是立即执行,而是在当前执行栈清空后执行
  • 可用于等待浏览器完成 UI 渲染后再执行回调
  • 适合调整异步任务的执行顺序,宏任务会在微任务之后执行
  • 处理大量数据时分批执行,避免长时间阻塞主线程