JavaScript
Browser APIs
Timers (setTimeout / setInterval)
เรียนรู้การใช้ setTimeout สำหรับรันโค้ดครั้งเดียวหลัง delay และ setInterval สำหรับรันซ้ำ พร้อมวิธียกเลิก timer และข้อควรระวังที่พบบ่อย
setTimeout — รันโค้ดหลังจากหน่วงเวลา
`setTimeout` รับฟังก์ชัน (callback) และตัวเลข milliseconds แล้วรัน callback นั้น **ครั้งเดียว** หลังจากเวลาที่กำหนด syntax: `setTimeout(callback, delayMs)` `setTimeout` คืน timer ID — ตัวเลขที่ใช้ยกเลิก timer ได้ในภายหลัง
1000 ms = 1 วินาที — ถ้าใส่ 0 ms โค้ดยังไม่รันทันที แต่รอให้ call stack ว่างก่อน
// แสดงข้อความหลัง 2 วินาที
setTimeout(function() {
console.log("2 วินาทีผ่านไปแล้ว");
}, 2000);
// arrow function
setTimeout(() => {
document.querySelector("#message").textContent = "โหลดเสร็จแล้ว!";
}, 1500);setInterval — รันโค้ดซ้ำทุก n milliseconds
`setInterval` รับฟังก์ชันและตัวเลข milliseconds แล้วรัน callback นั้น **ซ้ำๆ** ทุกช่วงเวลาที่กำหนด จนกว่าจะหยุดด้วย `clearInterval` syntax: `setInterval(callback, intervalMs)`
ต้องเก็บ timer ID ไว้ — ถ้าไม่เก็บจะหยุด interval ทีหลังไม่ได้
let count = 0;
const timerId = setInterval(function() {
count++;
document.querySelector("#count").textContent = count;
}, 1000); // ทำงานทุก 1 วินาทีclearTimeout / clearInterval — ยกเลิก timer
ส่ง timer ID ที่ได้จาก `setTimeout` หรือ `setInterval` ให้ `clearTimeout` หรือ `clearInterval` เพื่อยกเลิก
ถ้าไม่ clearInterval เมื่อไม่ใช้แล้ว interval จะทำงานต่อไปในพื้นหลังตลอด — เป็น memory leak
// ยกเลิก setTimeout ก่อนครบเวลา
const id = setTimeout(() => console.log("จะไม่รัน"), 3000);
clearTimeout(id);
// หยุด setInterval เมื่อนับถึง 5
let count = 0;
const intervalId = setInterval(() => {
count++;
console.log(count);
if (count >= 5) {
clearInterval(intervalId);
console.log("หยุดแล้ว");
}
}, 1000);ข้อควรระวัง
- **delay ไม่แม่นยำ 100%** — `setTimeout(fn, 0)` ไม่รันทันที แต่รอให้ call stack ว่างก่อน ค่า delay คือ "อย่างน้อย" ไม่ใช่ "พอดีเป๊ะ"
- **เก็บ timer ID เสมอ** — ถ้าไม่เก็บ ID ของ `setInterval` จะหยุดมันทีหลังไม่ได้
- **อย่า setInterval ซ้อน** — เรียก `setInterval` หลายครั้งโดยไม่ clear ของเดิม จะมี interval หลายตัวทำงานพร้อมกัน ทำให้ค่าเปลี่ยนเร็วผิดปกติ
- **`this` ใน callback** — regular function ใน `setTimeout`/`setInterval` จะมี `this` เป็น `window` — ใช้ arrow function หรือ `.bind(this)` ถ้าต้องการ `this` ของ object