function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
}
window.onload = countBodyChildren; // 正確
window.onload = countBodyChildren(); // 錯誤
| 寫法 | 含義 | 執行時機 | 結果 |
|---|---|---|---|
window.onload = countBodyChildren | 賦值函數引用 | 頁面載入完成時,由瀏覽器自動調用 | ✅ 正確 |
window.onload = countBodyChildren() | 賦值函數執行結果(返回值) | 代碼解析階段立即執行 | ❌ 錯誤(通常為 undefined) |
// 寫法 1:賦值引用
window.onload = countBodyChildren;
// 內存:onload → 指向函數 countBodyChildren 的地址
// 頁面載入完 → 瀏覽器調用 onload() → 彈窗顯示節點數
// 寫法 2:賦值調用結果
window.onload = countBodyChildren();
// 立即執行 countBodyChildren() → 彈窗顯示節點數 → 返回 undefined
// 內存:onload → undefined
// 頁面載入完 → 瀏覽器嘗試調用 undefined() → TypeError 或靜默失敗
// ✅ 正確:傳遞函數引用
btn.onclick = handleClick;
element.addEventListener('click', handleClick);
// ❌ 錯誤:立即執行
btn.onclick = handleClick();
// ✅ 需傳參時:使用箭頭函數/匿名函數包裹
btn.onclick = () => handleClick(arg1, arg2);
element.addEventListener('click', () => handleClick(arg1, arg2));
DOMContentLoaded:HTML 解析完成,DOM 樹就緒(不等待圖片/樣式)load(window.onload):所有資源(圖片、CSS、Script)完全載入DOMContentLoaded 或將 Script 放 </body> 前記住口訣:「賦值不加括號,調用才加括號」。事件處理器期望的是函數引用,而非執行結果。