الدرس 8 من 8
دوال تتذكّر
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
بيانات خاصة بالدالة دون متغيّر عامّ
الشرح
كل دالة في JavaScript تحتفظ بالمتغيّرات الموجودة في المكان الذي أُنشئت فيه، فإذا أرجعتَ دالة من داخل دالة أخرى بقيت الداخلية قادرة على الوصول إلى متغيّرات الخارجية حتى بعد انتهاء تنفيذها، وهذا ما يُسمّى الإغلاق (closure).
وفائدته أنه يحفظ بيانات خاصة دون متغيّر عامّ، فالدالة makeCounter() تُنشئ let count = 0 ثم تُرجع دالة تزيده، ولا يستطيع أي كود آخر الوصول إلى count غير تلك الدالة، وكل استدعاء لـ makeCounter يصنع عدّادًا جديدًا مستقلًّا. وتعتمد على الإغلاق أساليب كثيرة ستراها لاحقًا، مثل تحديد معدّل الاستدعاءات (throttle)، وحفظ نتائج الدالة حتى لا تُحسب مرّتين (memoization)، والدالة التي لا تعمل إلا مرّة واحدة.
والخطأ الشائع أن تعرّف المتغيّر خارج الدالة التي تصنع العدّاد، فيبدو كل شيء سليمًا ما دام عندك عدّاد واحد، ثم تُنشئ عدّادًا ثانيًا فتجد الاثنين يشتركان في العدد نفسه.
المطلوب
اكتب makeCounter() لتُرجع دالة تعطي 1 ثم 2 ثم 3 كلما استدعيتها، واكتب once(fn) لتُرجع دالة تستدعي fn في المرّة الأولى فقط، ثم تُرجع النتيجة الأولى نفسها في كل استدعاء بعدها.
الفحوص
6 فحوص- العدّاد يتذكّر قيمته فيعطي 1 ثم 2 ثم 3
- كل عدّاد يحفظ عدده وحده
- الدالة الممرَّرة إلى once تُستدعى مرّة واحدة
- الدالة التي تُرجعها once تعيد النتيجة الأولى في كل استدعاء
- كل دالة تصنعها once تحفظ حالتها وحدها
- زرّ «ابدأ الجولة» لا يعمل إلا مرّة واحدة