تقديم انتباهكم هو ترجمة لمقال بقلم Parathan Thiyagalingam منشور على medium.freecodecamp.org. تريد أن تعرف كيف تعمل إغلاق جافا سكريبت؟ انظر تحت القط!
 صور أوستن ديستل مع Unsplash
صور أوستن ديستل مع Unsplashالإغلاق عبارة عن مزيج من جميع المتغيرات في النطاق في وقت إنشاء الوظيفة. لاستخدام الإغلاق ، تحتاج إلى إنشاء دالة متداخلة ، أي دالة داخل الوظيفة. سيكون للوظيفة الداخلية وصول إلى المتغيرات في نطاق الوظيفة الخارجية حتى بعد اكتمال الوظيفة الخارجية. (هذا هو 
الإغلاق الذي يوفر هذا الوصول.) في كل مرة يتم إنشاء وظيفة ، يتم إنشاء الإغلاق.
قبل أن تبدأ في فهم مفهوم عمليات الإغلاق ، ضع في اعتبارك ما هي سلاسل النطاق في JavaScript. 
كقاعدة عامة ، هناك نوعان من مناطق الرؤية: عالمية ومحلية.
في JavaScript ، لا يمكن الوصول إلى متغير داخل إحدى الوظائف خارجيًا - على عكس ، على سبيل المثال ، المتغيرات داخل كتلة (في ظروف مثل 
if while ).
بناءً على ذلك ، فإن وظيفة في JavaScript لها نطاق ، لكن الكتلة لا تحتوي على نطاق.
 var a = 10; function app(){ var b = 2; console.log(a);  
كما نعلم بالفعل ، فإن 
a هو متغير عالمي ، و 
b هو محلي ، أي ، يستخدم فقط من خلال وظيفة 
app . خارج النطاق المحلي ، لا يمكننا الوصول إلى المتغير المحلي.
كيفية استخدام دالة متداخلة (وظيفة داخل وظيفة)
 var a = 10; function app(){ var b = 2; var d = 3; function add(){ var c = a + b; } return add; } var x = app(); console.dir(x); 
في المثال أعلاه ، 
app هو الوظيفة الأصل ، 
add هي الوظيفة الفرعية.
- بدلاً من console.log ، يتم استخدام console.dir لعرض كل خصائص الكائن المحدد.
- يتم تعيين المتغير x إلى وظيفة app، والتي تقوم بإرجاع وظيفةadd. يسمح لك هذا برؤية كل خصائص كائن وظيفةadd.
إذا قمت بفتح وحدة التحكم في مستعرض ، فستجد كائن 
Closure داخل صفيف بيانات النطاق.

نظرًا لأن 
add الداخلية 
add لها حق الوصول إلى المتغيرات 
b و 
d التي تنتمي إلى الوظيفة الخارجية ، سيتم إضافة هذين المتغيرين إلى كائن 
Closure كمرجع.
النظر في مثال آخر إغلاق.
 var a = 10; var startFunc; function app(){ var b = 2; function add(){ var c = a + b; console.log(c); } startFunc = add(); } app();  
- startFuncتعيين وظيفة- startFuncالعالمية بوظيفة- add، والتي هي تابعة- appالوظيفة الأصل.
- يصبح هذا ممكنًا فقط بعد استدعاء وظيفة التطبيق. خلاف ذلك ، سوف تتصرف وظيفة startFuncكمتغير عام بدون قيمة معينة.
كيفية استخدام الإغلاق في جافا سكريبت
الكثير منا ، باستخدام الإغلاق عند كتابة التعليمات البرمجية ، لا يفهمون تمامًا سبب قيامهم بذلك. يفتقر JavaScript إلى المعدلات 
العامة والمحمية والخاصة الموجودة في لغات البرمجة الموجهة للكائنات. لذلك ، لمنع الوصول إلى مساحة الاسم للرمز الخارجي ، نحن مضطرون إلى اللجوء إلى مساعدة من الوظائف.
وبما أننا نتحدث عن الوظائف - تبدأ 
الوظيفة المسماة فورًا (IIFE) فور الإعلان. إنها لا تحتاج حتى أن يتم استدعاؤها.
بناء جملة IIFE يشبه هذا:
 (function(){  
النظر في هذا المثال:
 var studnetEnrollment = (function () {  
count prefix متغيرين خاصين لا يمكن تغييرهما. الوصول إليها مفتوح فقط للوظيفة الداخلية (في حالتنا ، هذه هي الدالة 
innerFunc ).
- في المرة الأولى التي يتم فيها استدعاء دالة studentEnrollmentتزيد دالةstudentEnrollmentمن قيمة متغيرcountإلى 1.
- في المرة الثانية ، يزداد countمن 1 إلى 2.
- كل هذا ممكن فقط من خلال الإغلاق.
استنتاج
الإغلاق عبارة عن مجموعة من متغيرات دالة خارجية ، والتي يمكن من خلالها الوصول إلى نطاق هذه المتغيرات من نطاق الوظيفة الداخلية. هذا يحمي مساحة الاسم العالمية.
تتيح وظيفة الإغلاق للمطورين كتابة تعليمات برمجية نظيفة - كما هو الحال في لغات البرمجة الموجهة للكائنات ، والتي لا يتم فيها خلط المتغيرات العامة والمحلية.
هل لديك الترميز لطيفة!