في هذا الدرس 5تصفّح المواضيع
تعتمد JavaScript نظام النطاق المعجمي الثابت (Lexical Scoping)؛ أي أن قدرة الدالة على رؤية المتغيرات المحيطة تتحدد وفق المكان الذي كُتبت فيه داخل الكود المصدري لا مكان استدعائها. فكل دالة داخلية متداخلة ترى تلقائياً معاملات ومتغيرات دالتها الأم المحيطة بها.
تأمل معضلة العداد الشهيرة: إذا وضعت let count = 0 في النطاق العام، استطاع أي سطر بالصفحة تخريبه وإسناد قيمة خاطئة له. وإن وضعته داخل دالة عادية، تصفّر وعاد إلى 0 في كل استدعاء! وهنا تحل المغلفات (Closures) المشكلتين معاً بكفاءة باهرة:
| طريقة تخزين الحالة | هل تحتفظ بالقيمة بين الاستدعاءات؟ | هل هي محمية من العبث الخارجي؟ |
|---|---|---|
| متغير عام بالملف | نعم، يبقى طوال فتح الصفحة | لا، أي كود خارجي يمكنه تغييره بالخطأ |
| متغير محلي عادي | لا، يُنشأ من الصفر عند كل استدعاء | نعم، معزول داخل الدالة |
| متغير داخل Closure | نعم، محفوظ في البيئة المعجمية المرافقة | نعم، لا يُقرأ ولا يُعدل إلا عبر الدالة المرجعة |
يُعرّف المغلف البرمجي (Closure) بأنه اقتران الدالة برابط حي نحو بيئتها المعجمية المحيطة. فعندما تُرجع الدالة الخارجية دالةً داخلية وتنتهي مهمتها على مكدس الاستدعاءات، لا تُمسح متغيراتها المحلية بل تبقى حية في «حقيبة ذاكرة» خفية ترافق الدالة المرجعة أينما ذهبت!
function makeBadge(prefix) {
return function (memberName) {
return '[' + prefix + '] ' + memberName;
};
}
const vipTag = makeBadge('VIP');
document.getElementById('cls-out').textContent = vipTag('Faisal');
ينشئ كل استدعاء لدالة مصنعية مثل createCounter() بيئة مغلف مستقلة تماماً في الذاكرة؛ فاستدعاء counterA() يزيد عداده الخاص دون أي تأثير على counterB()، ولا يملك أي كود خارجي وسيلة للوصول المباشر إلى المتغير count أو تخريبه.
function createCounter(start) {
let count = start;
return function () {
count += 1;
return count;
};
}
const nextTicket = createCounter(100);
document.getElementById('cnt-cls').textContent = nextTicket() + ' -> ' + nextTicket();
عند إنشاء دوال داخل حلقة تستخدم var i، ينشئ المحرك متغيراً واحداً مشتركاً لكل الدورات؛ وحين تعمل تلك الدوال لاحقاً تجد أن i قد وصلت إلى القيمة النهائية بعد انتهاء الحلقة! أما استبدالها بـ let i فينشئ نسخة مستقلة في كل دورة تحتفظ بها كل دالة داخل مغلفها بدقة.
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس البيئة المعجمية، وآلية احتفاظ المغلفات Closures بذاكرة الدالة الأم، وبناء العدادات الخاصة المحمية، وحل فخ الحلقات الشهير عبر let. الخطوة التالية: انتقل إلى درس «نطاق المتغيرات والرفع في JavaScript» لرسم الخريطة الشاملة لسلسلة النطاقات وآلية الرفع Hoisting.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات3
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Closure المغلف البرمجي Closure
- اقتران الدالة الداخلية برابط حي نحو متغيرات بيئتها المعجمية المحيطة حتى بعد انتهاء تنفيذ الدالة الخارجية.
- للمراجعة
- 02 Lexical Scoping النطاق المعجمي الثابت
- قاعدة تحديد رؤية المتغيرات تبعاً لموضع كتابة الدالة وتداخلها النصي في الكود المصدري.
- للمراجعة
- 03 Factory Function الدالة المصنعية
- دالة تهيئ متغيرات محلية خاصة ثم ترجع دالة أو كائناً يمتلك صلاحية حصرية للتعامل مع تلك المتغيرات.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات2
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 VIP VIP
- Very Important Person Tier
- فئة العضوية المحفوظة داخل البيئة المعجمية لدالة التوسيم في مثال المصنع.
- للمراجعة
- 02 RAM RAM
- Random Access Memory
- ذاكرة النظام الحية التي يحتفظ فيها المحرك بمتغيرات المغلف طالما بقيت الدالة الداخلية قابلة للاستدعاء.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
بدّل بين التبويبين الثاني والثالث في محاكي المغلفات لمشاهدة سبب إنتاج var للرقم 4 واحتفاظ let بقيم الدورات.
-
افتح مثال createCounter وأنشئ عداداً ثانياً يبدأ من 500 للتحقق من استقلال ذاكرة كل مغلف.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.