0Pricing
JavaScript Academy · บทเรียน

Debounce กับ Throttle — เขียนเอง

สร้างตัวช่วย debounce และ throttle ขนาดเล็ก ฝึกใช้รูปแบบทำงานท้ายและทำงานต้น และรู้ว่าเมื่อใดควรเลือกแต่ละแบบ

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

ภาพรวม

เป้าหมาย: ควบคุมเหตุการณ์ที่เกิดถี่และไม่สม่ำเสมอ

  • การหน่วงรอ: รอจนเงียบ แล้วทำงานครั้งเดียว
  • การจำกัดความถี่: ทำงานไม่เกินหนึ่งครั้งต่อช่วงเวลา
  • การเรียกช่วงเริ่มต้นเทียบกับช่วงท้าย
  • ตัวช่วยขนาดเล็กที่อ่านง่าย
Debounce กับ Throttle — เขียนเอง — ภาพประกอบ 1

การหน่วงรอ (ช่วงท้าย)

การหน่วงรอช่วงท้าย ตั้งเวลาตัวจับเวลาใหม่ทุกครั้งที่เกิดเหตุการณ์ และทำงานครั้งเดียวเมื่อเหตุการณ์สงบลง

// 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 กับ Throttle — เขียนเอง — ภาพประกอบ 2

การหน่วงรอ (ช่วงเริ่มต้น)

การหน่วงรอช่วงเริ่มต้น ทำงานทันที แล้วป้องกันการทำซ้ำจนกว่าช่วงเวลาที่เงียบจะสิ้นสุด

// 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);
}
Debounce กับ Throttle — เขียนเอง — ภาพประกอบ 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);
}
Debounce กับ Throttle — เขียนเอง — ภาพประกอบ 4

การจำกัดความถี่ (ช่วงท้าย)

การจำกัดความถี่ช่วงท้าย ทำให้แน่ใจว่าคุณยังได้รับค่าล่าสุดเมื่อช่วงเวลานั้นสิ้นสุด

// 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 — เขียนเอง — ภาพประกอบ 5

ควรใช้แบบใดเมื่อไร

การเลือกใช้:

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

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

ตรวจสอบอย่างรวดเร็ว: จำกัดการเรียกต่อช่วงเวลา

Debounce กับ Throttle — เขียนเอง — ภาพประกอบ 7

ทบทวน

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

Debounce กับ Throttle — เขียนเอง — ภาพประกอบ 8

คำถามที่พบบ่อย

บทเรียน “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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. setTimeout, setInterval และการคลาดเคลื่อนของตัวจับเวลา
  2. Debounce กับ Throttle — เขียนเอง
  3. การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา
← กลับไปที่ JavaScript Academy