這是前端開發中常見的效能優化問題,特別在處理 scroll
、resize
、input
事件時。
📌 throttle
(節流)
當事件頻繁觸發時,throttle
讓函式在固定時間內執行一次,防止執行頻率過高。適合用於 監聽滾動、滑鼠移動、視窗調整大小 等場景。
🔹 例子:滾動時顯示「返回頂部」按鈕
javascript
複製編輯function throttle(func, delay) {
let lastTime = 0;
return function (...args) {
const now = Date.now();
if (now - lastTime >= delay) {
func.apply(this, args);
lastTime = now;
}
};
}
window.addEventListener("scroll", throttle(() => {
console.log("滾動中...");
}, 300));
debounce
(防抖)當事件觸發後,等待一段時間後才執行函式,如果期間再次觸發,計時器會重置。適合用於 搜尋框輸入、表單驗證、API 查詢 等場景。
🔹 例子:搜尋框即時建議
javascript
複製編輯function debounce(func, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
document.getElementById("search").addEventListener("input", debounce((e) => {
console.log("搜尋內容:" + e.target.value);
}, 500));
🚀 應用場景:
throttle
:監聽滾動事件、監聽視窗大小變化debounce
:搜尋框即時建議、表單驗證、API 查詢如何讓你的網站載入更快?這些技術幫助你提升至少 30% 的效能!
這是影響瀏覽器效能的關鍵機制:
如何降低影響? ✅ 避免逐步改變樣式(一次性修改) ✅ 使用 transform
取代 top/left
✅ 使用 will-change
提示瀏覽器預先優化
Redux Toolkit 是官方推薦的 Redux 開發工具,提供簡化流程的 API:
createSlice
:簡化 reducer 撰寫createAsyncThunk
:內建異步處理React Fiber 讓 React 更高效,並帶來 Concurrent Mode、Suspense 等特性。
JavaScript 是單執行緒的,透過 Event Loop 處理非同步操作。
javascript
複製編輯console.log("A");
setTimeout(() => {
console.log("B");
}, 0);
console.log("C");
執行結果:
css
複製編輯A
C
B
🔹 原因:
console.log("A")
立即執行setTimeout
被放入 Web API,等待回調console.log("C")
立即執行B
才進入 Event Queue,最後被執行📌 setTimeout(fn, 0)
何時執行? 📌 Promise.then()
與 setTimeout()
誰先執行?
HOC 是 React 組件的設計模式,透過函式回傳新組件來共用邏輯。
const withAuth = (Component) => (props) => {
return isAuthenticated ? <Component {...props} /> : <Login />;
};
📌 useState
javascript
複製編輯const [count, setCount] = useState(0);
setCount(count + 1);
useReducer
javascript
複製編輯const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
default:
return state;
}
};
const [state, dispatch] = useReducer(reducer, { count: 0 });
dispatch({ type: "increment" });
📌 何時該用 useReducer
? 📌 useReducer
與 Redux 的區別?
留言分享你的解答,或看看其他開發者的面試經驗吧! 🎤