new Image() 並設置 src 時:
img.src = '...' 這行代碼瞬間完成,不阻塞後續代碼。var img = new Image();
console.log('1. 賦值前');
img.src = 'large.jpg';
console.log('2. 賦值後,立即執行'); // 立即輸出,不等圖片加載
img.onload = () => console.log('3. 圖片加載完成'); // 異步回調
document.body.appendChild(img);
輸出順序:1 → 2 → (網絡延遲後)3。
// IntersectionObserver API(現代、高性能)
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src; // 觸發異步下載
observer.unobserve(img);
}
});
});
document.querySelectorAll('img[data-src]').forEach(img => observer.observe(img));
| 階段 | 同步/異步 | 說明 |
|---|---|---|
| JS 賦值 src | 同步 | 微任務級,極快 |
| 瀏覽器發請求 | 異步 | 網絡 I/O,受帶緩存影響 |
| 解碼/渲染 | 異步 | 主線程空閒時執行 |
| onload 回調 | 異步 | 微任務隊列 |