Debounce กับ Throttle — เขียนเอง
สร้างตัวช่วย debounce และ throttle ขนาดเล็ก ฝึกใช้รูปแบบทำงานท้ายและทำงานต้น และรู้ว่าเมื่อใดควรเลือกแต่ละแบบ
Debounce กับ Throttle — เขียนเอง เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
ภาพรวม
เป้าหมาย: ควบคุมเหตุการณ์ที่เกิดถี่และไม่สม่ำเสมอ
- การหน่วงรอ: รอจนเงียบ แล้วทำงานครั้งเดียว
- การจำกัดความถี่: ทำงานไม่เกินหนึ่งครั้งต่อช่วงเวลา
- การเรียกช่วงเริ่มต้นเทียบกับช่วงท้าย
- ตัวช่วยขนาดเล็กที่อ่านง่าย

การหน่วงรอ (ช่วงท้าย)
การหน่วงรอช่วงท้าย ตั้งเวลาตัวจับเวลาใหม่ทุกครั้งที่เกิดเหตุการณ์ และทำงานครั้งเดียวเมื่อเหตุการณ์สงบลง
// Debounce (trailing): run once after events stop
function debounce(fn, wait) {
let t = null;
return function (...args) {
clearTimeout(t);
t = setTimeout(function () {
fn.apply(null, args);
}, wait);
};
}
// Simulate rapid events: only the last triggers the call
const debouncedLog = debounce(function (msg) {
console.log("debounced:", msg);
}, 10);
for (let i = 0; i < 5; i++) {
setTimeout(function () {
debouncedLog("final after bursts");
}, i * 3);
}

การหน่วงรอ (ช่วงเริ่มต้น)
การหน่วงรอช่วงเริ่มต้น ทำงานทันที แล้วป้องกันการทำซ้ำจนกว่าช่วงเวลาที่เงียบจะสิ้นสุด
// Debounce (leading): first call fires immediately, then ignore until quiet
function debounceLeading(fn, wait) {
let t = null;
return function (...args) {
if (t === null) {
fn.apply(null, args);
}
clearTimeout(t);
t = setTimeout(function () {
t = null;
}, wait);
};
}
// Demo: first call prints quickly; later bursts are ignored until quiet
const firstTap = debounceLeading(function (x) {
console.log("leading:", x);
}, 12);
for (let i = 0; i < 4; i++) {
setTimeout(function () {
firstTap("first-then-wait");
}, i * 3);
}

การจำกัดความถี่ (ช่วงเริ่มต้น)
การจำกัดความถี่ จำกัดการเรียกให้เหลือหนึ่งครั้งต่อช่วงเวลา และละทิ้งการเรียกส่วนเกิน
// Throttle (leading): at most once per interval
function throttle(fn, wait) {
let last = 0;
return function (...args) {
const now = Date.now();
if (now - last >= wait) {
last = now;
fn.apply(null, args);
}
};
}
// Demo: many events, but prints at most once every 10ms
const throttled = throttle(function (n) {
console.log("throttled:", n);
}, 10);
for (let i = 0; i < 10; i++) {
setTimeout(function () {
throttled(i);
}, i * 2);
}

การจำกัดความถี่ (ช่วงท้าย)
การจำกัดความถี่ช่วงท้าย ทำให้แน่ใจว่าคุณยังได้รับค่าล่าสุดเมื่อช่วงเวลานั้นสิ้นสุด
// Throttle (trailing): schedule the last call within the window
function throttleTrailing(fn, wait) {
let last = 0;
let timer = null;
let queuedArgs = null;
function invoke(args) {
last = Date.now();
fn.apply(null, args);
}
return function (...args) {
const now = Date.now();
const remaining = wait - (now - last);
if (remaining <= 0) {
// Window passed: run now
clearTimeout(timer);
timer = null;
queuedArgs = null;
invoke(args);
} else {
// Queue the latest args to run at the end of the window
queuedArgs = args;
clearTimeout(timer);
timer = setTimeout(function () {
timer = null;
if (queuedArgs) {
invoke(queuedArgs);
queuedArgs = null;
}
}, remaining);
}
};
}
// Demo: last value in a burst is printed after the window
const trail = throttleTrailing(function (x) {
console.log("trail:", x);
}, 10);
for (let i = 0; i < 6; i++) {
setTimeout(function () {
trail("v" + i);
}, i * 3);
}

ควรใช้แบบใดเมื่อไร
การเลือกใช้:
- การหน่วงรอ: การค้นหาขณะพิมพ์ การปรับขนาด — ทำงาน หลังจากผู้ใช้หยุด
- การจำกัดความถี่: การเลื่อน/ลาก — จำกัดการเรียกให้มีจังหวะสม่ำเสมอ
- ใช้ช่วงเริ่มต้นเพื่อการตอบสนองทันที และใช้ช่วงท้ายเพื่อเก็บค่าครั้งสุดท้าย

แบบทดสอบการหน่วงรอเทียบกับการจำกัดความถี่
ตรวจสอบอย่างรวดเร็ว: จำกัดการเรียกต่อช่วงเวลา

ทบทวน
ทบทวน: คุณเขียนการหน่วงรอทั้งช่วงท้ายและช่วงเริ่มต้น สร้าง การจำกัดความถี่ ช่วงเริ่มต้นแบบง่าย และการจำกัดความถี่ช่วงท้ายแบบเบา ๆ เลือกการหน่วงรอสำหรับ “หลังจากผู้ใช้หยุด” และเลือกการจำกัดความถี่สำหรับ “จังหวะสม่ำเสมอ”

คำถามที่พบบ่อย
บทเรียน “Debounce กับ Throttle — เขียนเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Debounce กับ Throttle — เขียนเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Debounce กับ Throttle — เขียนเอง”
สร้างตัวช่วย debounce และ throttle ขนาดเล็ก ฝึกใช้รูปแบบทำงานท้ายและทำงานต้น และรู้ว่าเมื่อใดควรเลือกแต่ละแบบ คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “Debounce กับ Throttle — เขียนเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- setTimeout, setInterval และการคลาดเคลื่อนของตัวจับเวลา
- Debounce กับ Throttle — เขียนเอง
- การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา