ما هي عمليات الإغلاق في JavaScript وكيف تعمل؟



يتم إنشاء عمليات الإغلاق في JavaScript في كل مرة يتم فيها إنشاء وظيفة ، في وقت إنشاء الوظيفة. يوفر تحكمًا أفضل في الكود عند استخدامها.

هي لغة وظيفية تمنح المستخدم الكثير من الحرية. يمكنك إنشاء دالة ديناميكيًا أو نسخها إلى متغير آخر أو تمريرها كوسيطة إلى دالة أخرى والاتصال من مكان مختلف لاحقًا. يتم إنشاء عمليات الإغلاق في JavaScript في كل مرة يتم فيها إنشاء وظيفة ، في وقت إنشاء الوظيفة. في هذه المقالة ، سوف نفهم عمليات الإغلاق بالتسلسل التالي:

مقدمة عن الإغلاق في JavaScript

الإغلاق هو مزيج من وظيفة مجمعة مع الإشارات إلى الحالة المحيطة بها ، أي البيئة المعجمية. بمعنى آخر ، يتيح لك الإغلاق الوصول من دالة داخلية إلى نطاق وظيفة خارجية.





المبرمج - الإغلاق في جافا سكريبت - edureka

يستخدم معظم المطورين عمليات الإغلاق في JavaScript بوعي أو بغير وعي. يوفر تحكمًا أفضل في الكود عند استخدامها. أيضًا ، إنه السؤال الأكثر شيوعًا خلال أي .



مثال:

function foo () {var x = 10 function inner () {return x} return inner} var get_func_inner = foo () console.log (get_func_inner ()) console.log (get_func_inner ()) console.log (get_func_inner ())

انتاج:

ما هو أفضل بيئة تطوير متكاملة لجافا

10
10
10



هنا ، يمكنك الوصول إلى ملف متغير x التي تم تعريفها في الوظيفة foo () من خلال الوظيفة الداخلية () حيث تحافظ اللاحقة على سلسلة نطاق وظيفة التضمين في وقت تنفيذ وظيفة التضمين. وبالتالي ، فإن الوظيفة الداخلية تعرف قيمة x من خلال سلسلة نطاقها. هذه هي الطريقة التي يمكنك بها استخدام الإغلاق في JavaScript.

عمليات الإغلاق العملية

تسمح لك عمليات الإغلاق بربط البيئة المعجمية بوظيفة تعمل على تلك البيانات. هذا له أوجه تشابه واضحة مع البرمجة الشيئية ، حيث تسمح لنا الكائنات بربط خصائص الكائن بواحد أو أكثر من العمليات.

وبالتالي ، يمكنك استخدام الإغلاق في أي مكان قد تستخدم فيه كائنًا بطريقة واحدة فقط.

مثال:

دالة makeSizer (size) {return function () {document.body.style.fontSize = size + 'px'}} var size12 = makeSizer (12) var size14 = makeSizer (14) var size16 = makeSizer (16)

يتم إرفاق المثال أعلاه بشكل عام باعتباره رد اتصال: وظيفة واحدة يتم تنفيذها استجابة للحدث.

سلسلة النطاق

تحتوي عمليات الإغلاق في JavaScript على ثلاثة نطاقات مثل:

  • النطاق المحلي
  • نطاق الوظائف الخارجية
  • النطاق العالمي

الخطأ الشائع هو عدم إدراك أنه في الحالة التي تكون فيها الوظيفة الخارجية هي نفسها وظيفة متداخلة ، فإن الوصول إلى نطاق الوظيفة الخارجية يتضمن نطاقًا للوظيفة الخارجية ، مما يؤدي بشكل فعال إلى إنشاء سلسلة من نطاقات الوظائف.

// global domain var x = 10 function sum (a) {return function (b) {return function (c) {// external function domain return function (d) {// local domain return a + b + c + d + x}}}} console.log (sum (1) (2) (3) (4)) // log 20

يمكن أيضًا كتابتها بدون وظائف مجهولة:

كيف تصنع كومة في جافا
// global domain var x = 10 function sum (a) {return function sum2 (b) {return function sum3 (c) {// external function domain return function sum4 (d) {// local domain return a + b + c + d + x}}}} var s = sum (1) var s1 = s (2) var s2 = s1 (3) var s3 = s2 (4) console.log (s3) // log 20

في المثال أعلاه ، توجد سلسلة من الوظائف المتداخلة التي تتمتع جميعها بإمكانية الوصول إلى النطاق الخارجي للدالة ، وبالتالي يمكنك القول إن عمليات الإغلاق لها حق الوصول إلى جميع نطاقات الوظائف الخارجية التي تم الإعلان عنها من خلالها.

إغلاق داخل حلقة

يمكنك استخدام الإغلاق في JavaScript لتخزين وظيفة مجهولة في كل فهرس لملف مجموعة مصفوفة . لنأخذ مثالاً ونرى كيف يتم استخدام الإغلاق داخل الحلقة.

مثال:

الدالة الخارجية () {var arr = [] var i لـ (i = 0 i<3 i++) { // storing anonymus function arr[i] = function () { return i } } // returning the array. return arr } var get_arr = outer() console.log(get_arr[0]()) console.log(get_arr[1]()) console.log(get_arr[2]())

انتاج:

3
3
3
3

بهذا نكون قد وصلنا إلى نهاية مقالتنا. أتمنى أن تكون قد فهمت كيفية عمل الإغلاق في JavaScript وكيف يتم استخدامها للتحكم بشكل أفضل في الشفرة.

الآن بعد أن تعرفت على الإغلاق في JavaScript ، تحقق من ملف بواسطة Edureka. سيساعدك تدريب شهادة تطوير الويب على تعلم كيفية إنشاء مواقع ويب رائعة باستخدام HTML5 و CSS3 و Twitter Bootstrap 3 و jQuery و Google APIs ونشرها في Amazon Simple Storage Service (S3).

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في 'الإغلاق في JavaScript' وسنعاود الاتصال بك.