Debounce مقابل Throttle — بالتنفيذ اليدوي
ابنوا أداتي debounce وthrottle صغيرتين. وتدرّبوا على نسختي trailing وleading واعرفوا متى تختارون كل واحدة
Debounce مقابل Throttle — بالتنفيذ اليدوي درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 3 دروس في المجموع.
نظرة عامة
الهدف: التحكم في الأحداث المتتابعة.
- Debounce: الانتظار حتى تهدأ الأحداث، ثم التنفيذ مرة واحدة
- Throttle: التنفيذ مرة واحدة كحد أقصى في كل فترة زمنية
- الاستدعاءات المبكرة واللاحقة
- مساعدات صغيرة واضحة

Debounce (التنفيذ اللاحق)
يعيد Debounce اللاحق ضبط مؤقت عند كل حدث، وينفذ مرة واحدة عندما تهدأ الأحداث.
// 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 (التنفيذ المبكر)
يعمل Debounce المبكر فورًا، ثم يمنع التكرارات حتى تنتهي فترة الهدوء.
// 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 (التنفيذ المبكر)
يحد Throttle الاستدعاءات إلى استدعاء واحد كحد أقصى في كل فترة زمنية، ويتجاهل الاستدعاءات الزائدة.
// 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 (التنفيذ اللاحق)
يضمن Throttle اللاحق الحصول على أحدث قيمة عند نهاية الفترة.
// 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
تحقق سريع: الحد من الاستدعاءات في كل فترة زمنية.

مراجعة
مراجعة: طبّقتم Debounce اللاحق والمبكر، وThrottle المبكر البسيط واللاحق الخفيف. اختاروا Debounce للتنفيذ بعد توقف المستخدم، وThrottle للحفاظ على وتيرة ثابتة.

الأسئلة الشائعة
هل درس «Debounce مقابل Throttle — بالتنفيذ اليدوي» مجاني؟
نعم — نص درس «Debounce مقابل Throttle — بالتنفيذ اليدوي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 3 دروس في المجموع.
ماذا ستتعلم في «Debounce مقابل Throttle — بالتنفيذ اليدوي»؟
ابنوا أداتي debounce وthrottle صغيرتين. وتدرّبوا على نسختي trailing وleading واعرفوا متى تختارون كل واحدة تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.
كم من الوقت يستغرق درس «Debounce مقابل Throttle — بالتنفيذ اليدوي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- setTimeout وsetInterval وانحراف المؤقت
- Debounce مقابل Throttle — بالتنفيذ اليدوي
- توقيت التحريك — مقدمة عن الحلقات المعتمدة على الوقت