انتقل إلى محتوى الدرس
الدرس 147
دورة جافا سكريبت

اكتشاف وتصحيح الأخطاء البرمجية في JavaScriptJavaScript Debugging

أتقن اكتشاف وتصحيح أخطاء JavaScript بمنهجية علمية عبر قراءة مكدس الأخطاء ودوال console.table ونقاط التوقف الشرطية والكلمة debugger والتنقل السطري.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

تصحيح الأخطاء الاحترافي (Debugging) ليس تخميناً عشوائياً وتجربة تغييرات عمياء! بل يعتمد منهجية علمية هادئة من أربع خطوات: إعادة إنتاج المشكلة بانتظام ← قراءة مكدس الاستدعاءات ← تجميد السطر وفحص القيم ← معالجة السبب الجذري.

يمنحك مكدس الخطأ (Stack Trace) ثلاثة مفاتيح فورية: نوع الخطأ، ورسالته الدقيقة، ورقم السطر واسم الدالة التي وقع فيها الانهيار.

مخطط المنهجية الرباعية لتصحيح أخطاء JavaScript من قراءة المكدس ونقاط التوقف حتى التحقق

إلى جانب console.log() المعتادة، يزودك المتصفح بعائلة دوال تشخيصية متخصصة تختصر وقت الفحص بشدة:

الدالة التشخيصيةالميزة العملية في الفحصنصيحة الاستخدام الأفضل
console.log({ qty, price })تطبع اسم كل متغير بجانب قيمته تلقائياًتمنع التباس الأرقام المطبوعة بلا عنوان
console.table(records)تعرض مصفوفات الكائنات في جدول منظممثالية لفحص ردود JSON واكتشاف الحقول الناقصة
console.assert(cond, msg)لا تطبع تحذيراً إلا عند فشل الشرط فقطمراقبة الفرضيات المنطقية بهدوء
console.time / timeEndتقيس الزمن المنقضي بالمللي ثانية بدقةمقارنة سرعة خوارزميتين عملياً
console.trace()تطبع تسلسل الدوال التي أدت للسطر الحاليكشف الجهة التي استدعت دالة بالخطأ
JavaScript
const items = [{ sku: 'A1', price: '25' }, { sku: 'B2', price: 40 }];
console.table(items);
const badType = typeof items[0].price !== 'number';
console.assert(!badType, 'Price must be a number!');
document.getElementById('dbg-out').textContent =
  'Caught string price bug: ' + JSON.stringify({ firstType: typeof items[0].price });

بينما تكتفي الطباعة بعرض ما تذكرت طباعته فقط، تقوم نقاط التوقف (Breakpoints) بتجميد التنفيذ لحظياً لتفحص كافة المتغيرات المحلية والخارجية على الهواء مباشرة بطريقتين:

  • لوحة Sources في أدوات المطور: بالنقر على رقم السطر، أو بوضع نقطة توقف شرطية (Conditional Breakpoint) مثل total < 0 فلا يتوقف التنفيذ وسط ألف دورة إلا عند العنصر المسبب للخلل!
  • التعليمة البرمجية debugger;: توقف التنفيذ تلقائياً عند ذلك السطر متى كانت أدوات المطور مفتوحة (ويجب دائماً حذفها من الكود قبل نشر المشروع في الإنتاج!).
JavaScript
function calcDiscount(price, pct) {
  debugger;
  const cut = price * (pct / 100);
  return price - cut;
}
document.getElementById('run-dbg').addEventListener('click', () => {
  const finalPrice = calcDiscount(200, 15);
  document.getElementById('d-res').textContent = 'Final: $' + finalPrice;
});

بمجرد توقف التنفيذ عند نقطة توقف في تبويب Sources، تمنحك أزرار التحكم الأربعة قدرة المشي داخل الكود خطوة بخطوة مع مراقبة تغير القيم في لوحتي Scope وWatch:

  • استئناف (Resume — F8): متابعة التشغيل الطبيعي حتى نقطة التوقف التالية.
  • تخطي السطر (Step Over — F10): تنفيذ السطر الحالي كاملاً والوقوف على السطر الذي يليه مباشرة.
  • الدخول للدالة (Step Into — F11): الغوص داخل الدالة المستدعاة في هذا السطر لتتبع تفاصيلها الداخلية.
  • الخروج للمستدعي (Step Out — Shift+F11): إكمال الدالة الفرعية الحالية والعودة للوقوف عند السطر الذي استدعاها.

احتفظ بقائمة الفحص السريعة هذه؛ فهي تكشف أكثر من 80% من الأخطاء البرمجية اليومية في ثوانٍ معدودة:

  • جمع قيم الحقول كنصوص: خاصية input.value نص دائماً؛ فحولها بـ Number() قبل الجمع الحسابي!
  • خطأ إملائي في معرف العنصر: كتابة معرف غير موجود في getElementById تُرجع null وتسبب خطأ قراءة خاصية من null.
  • نسيان return مع الأقواس المعقوفة: كتابة arr.map((x) => { x * 2; }) تُرجع undefined!
  • نسيان كلمة await: محاولة قراءة نتيجة res.json() بدون await تعامل الوعد المعلق كأنه البيانات نفسها.
  • تجاوز حدود المصفوفة بواحد: كتابة الشرط i <= arr.length بدل < تقرأ فهرساً خارج النطاق يساوي undefined!
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتممت الفصل العشرين بإتقان منهجية تصحيح الأخطاء عبر قراءة مكدس الاستدعاءات، واستخدام console.table وconsole.assert، وإيقاف التنفيذ بنقاط التوقف وتعليمة debugger، والتنقل السطري وتجنب أشهر الأخطاء المتكررة. الخطوة التالية: انطلق إلى الفصل الحادي والعشرين (الأخير) بدءاً من درس «دوال الإنشاء المتقدمة في كائن المستند DOM»!

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Stack Trace مكدس الاستدعاءات Stack Trace
التقرير التسلسلي المرافق للخطأ والذي يعرض نوعه ورسالته وسلسلة الدوال وأرقام الأسطر المؤدية إليه.
للمراجعة
02 debugger Statement التعليمة البرمجية debugger
كلمة محجوزة تجمد تنفيذ السكربت عند السطر الحالي لفحص المتغيرات متى كانت أدوات المطور مفتوحة.
للمراجعة
03 Conditional Breakpoint نقطة التوقف الشرطية
نقطة توقف مقيدة بشرط منطقي لا تجمد الحلقة إلا عند تحقق الحالة الشاذة المراد فحصها.
للمراجعة
04 console.table الدالة التشخيصية console.table
دالة تعرض المصفوفات والكائنات في جدول منظم الأعمدة والصفوف داخل لوحة المطور.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 IDE IDE
Integrated Development Environment
بيئة التطوير المتكاملة التي تدعم ربط نقاط التوقف وفحص المتغيرات مع المتصفح.
للمراجعة
02 DOM DOM
Document Object Model
شجرة عناصر الصفحة التي تتيح وضع نقاط توقف تلقائية عند تعديل أي عنصر فرعي.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. حوّل السعر النصي "25" إلى الرقم 25 بدون علامتي تنصيص في محرر التجربة الأول وتأكد من تحول النوع إلى number.

  2. افتح أدوات المطور (F12) ثم اضغط زر التشغيل في محرر التجربة الثاني لمشاهدة توقف التنفيذ وفحص المتغيرات الحية.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

ماذا تفعل تعليمة debugger; عندما يتصفح زائر عادي الصفحة وأدوات المطور مغلقة؟

02

ما دالة الفحص في console التي تلتزم الصمت عند سلامة الشرط ولا تطبع رسالة خطأ إلا إذا كان الشرط false؟

03

عند التوقف على سطر يستدعي الدالة formatTax، أي زر تنقل يدخل إلى داخل أسطر تلك الدالة لتتبعها؟

04

أي دالة في كائن console تعرض مصفوفة الكائنات في جدول منظم الأعمدة والصفوف داخل لوحة المطور؟

05

ما السبب المباشر لظهور الخطأ TypeError: Cannot read properties of null عند استدعاء addEventListener بعد getElementById؟

06

تتيح نقطة التوقف الشرطية تجميد حلقة من 5000 عنصر فقط في اللحظة التي يتحقق فيها شرط الخلل المحدد.

07

ماذا تُرجع العبارة [1, 2, 3].map((n) => { n * 10; }) عند وضع أقواس معقوفة ونسيان كلمة return؟

08

ما أداة DevTools التي تكشف السطر البرمجي المسؤول تحديداً عن تعديل أو حذف عنصر معين في الصفحة؟

09

يجب تمرير نفس النص التسموي تماماً في كل من console.time وconsole.timeEnd لقياس الزمن المنقضي بينهما.

10

يُنصح بترك تعليمات debugger; وطباعة الرموز الحساسة داخل نسخة الإنتاج النهائية لتسهيل عمل الزوار.