جافا سكريبت نطاق المعجم والإغلاق



جافا سكريبت ترجمة البيئة ، معجم نطاق والإغلاق .

دعنا نتحدث عن البيئة. كوكبنا الضخم هو واحد للجميع. أثناء بناء مصنع كيميائي جديد ، سيكون من الجيد عزله حتى لا تترك جميع العمليات الداخلية حدودها. يمكننا القول أن البيئة والمناخ المحلي لهذا النبات معزولان عن البيئة الخارجية.

يتم ترتيب البرنامج بالمثل. إن ما تقوم بإنشائه خارجيًا - الوظائف الخارجية ، والبيانات الشرطية ، والحلقات ، وكتل أخرى - هو بيئة عالمية خارجية.



age الثابت ، وظيفة multiplier ، والمتغير الناتج في البيئة الخارجية. هذه المكونات لها نطاق عالمي. النطاق هو المنطقة التي يتوفر فيها المكون.

في هذه الحالة ، يكون x ثابتًا في وظيفة multiplier . نظرًا لأنه داخل كتلة من التعليمات البرمجية ، فهو ثابت محلي ، وليس عالمي. يكون مرئيًا فقط داخل الوظيفة ، ولكن ليس خارجها - يكون نطاقها محليًا.

تحتوي وظيفة multiplier على مكون آخر من النطاق المحلي - وهذه هي الوسيطة num . تعريفه أصعب من الثابت أو المتغير ، لكنه يتصرف كالمتغير المحلي تقريبًا.

ليس لدينا وصول خارجي إلى x - لا يبدو أنه موجود:



console.log تسمى x في بيئة عامة لم يتم تعريفها بها. نتيجة لذلك ، حصلنا على ReferenceError.

يمكننا ضبط x مستوى العالم:



لدينا علامة x عمومية ذات قيمة معروفة ، لكن علامة x المحلية في دالة multiplier لا تزال مرئية فقط من الداخل. هذه x غير متصلة بأي طريقة - فهي في بيئات مختلفة. على الرغم من الاسم نفسه ، فإنها لا تختلط.

أي كتلة من التعليمات البرمجية في الأقواس تصبح بيئة محلية. فيما يلي مثال لاستخدام if :



يحدث الشيء نفسه مع while وللحلقات.

يعني ذلك المحلية غير مرئية من الخارج. وهذا هو ، والعالمية واضحة في كل مكان ، حتى داخل الأشياء؟ نعم!



المتغير الشامل a قد تغير داخل وظيفة changer . تصبح الوظيفة نافذة المفعول فقط عند استدعاؤها ، وليس عند تعريفها ، وبالتالي في البداية a=0 ، وعند changer ، يأخذ changer القيمة 1 .

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

الجزء الثاني نطاق المعجمية


ألق نظرة على هذا البرنامج:



ترجع دالة multiplier نتائج الضرب a و b . تعطى داخليا ، ولكن b ليس كذلك.

عند محاولة إجراء عملية الضرب a*b ، يبحث JavaScript عن قيم a و b . يبدأ بالبحث من الداخل ، ثم يخرج ، ويدرس منطقة تلو الأخرى ، حتى يجد ما كان يبحث عنه ، أو لا يفهم أنه من المستحيل العثور عليه.

لذلك ، في هذا المثال ، يبدأ JavaScript في البحث عن منطقة داخلية - داخل وظيفة multiplier . يجد على الفور القيمة ويذهب إلى b . b لن يجدها في البيئة المحلية ، لذلك يتجاوزها. هناك يتعلم أن b هو 10 . لذلك تتحول a*b إلى 5*10 ، ثم إلى 50 .

يمكن أن يكون جزء الكود هذا داخل وظيفة أخرى ، وهو أيضًا داخل وظيفة أخرى. بدون العثور على b في الطبقة الأولى ، سوف يستمر JavaScript في البحث عن كل شيء في طبقات جديدة وجديدة ، أكثر وأكثر.

يرجى ملاحظة أن a=7 لا يؤثر على نتيجة العمليات الحسابية بأي شكل من الأشكال: تم العثور على قيمة a في الداخل ، وبالتالي فإن a الخارجي لا يلعب دورًا.

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

الجزء الثالث. دوائر قصيرة


يتم دعم البيئات والنطاقات بمعظم لغات البرمجة ، وتتيح هذه الآلية إدخال عمليات الإغلاق. الإغلاق وظيفة بطبيعتها "تتذكر" الكيانات الخارجية المستخدمة داخليًا.

قبل المتابعة ، دعنا نتذكر كيف يتم إنشاء الوظائف واستخدامها:



f هي وظيفة عديمة الفائدة جميلة ترجع دائمًا 0 . تتكون المجموعة من جزأين - ثابت والوظيفة نفسها.

من المهم أن تتذكر أن هذه مكونات منفصلة. المكون الأول ثابت يسمى f . يمكن أن تكون قيمتها رقمًا أو قيمة سلسلة. في هذه الحالة ، تكون القيمة دالة.

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

عند استدعاء هذه الوظيفة:



يتم إنشاء "مربع" جديد بناءً على الوصف من ورقة.

العودة إلى الإغلاقات. هنا هو رمز عينة.



تقوم دالة createPrinter بإنشاء name ثابت ، ثم وظيفة تسمى printName . كلاهما محلي إلى وظيفة createPrinter ومتاح فقط داخلها.

printName يحتوي printName نفسه على مكونات محلية ، ولكن هناك إمكانية الوصول إلى النطاق الذي تم إنشاؤه فيه ، وإلى البيئة الخارجية ، حيث يتم تعيين name ثابت.

ترجع الدالة printName وظيفة printName . تذكر أن تعريفات الوظائف هي أوصاف للوظائف الجارية ؛ فهي مجرد عناصر بيانات ، مثل الأرقام أو السلاسل. لذلك ، يمكننا إرجاع تعريف دالة بنفس طريقة إرجاع الأرقام.

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

إليك الشيء المضحك: تم إنشاء name الثابت داخل وظيفة createPrinter . تم استدعاء الوظيفة وتنفيذها. كما تعلم ، عندما تنتهي الوظيفة من العمل ، تتوقف عن الوجود. يختفي المربع السحري مع كل المحتويات.

لكنه عاد وظيفة أخرى تذكر بطريقة ما name ثابت. وبالتالي ، عند استدعاء myPrinter حصلنا على King - القيمة التي تتذكرها الوظيفة ، على الرغم من أن هذا المجال لم يعد موجودًا.

تسمى الدالة التي createPrinter بإرجاع createPrinter بإغلاق. الإغلاق هو مزيج من الوظيفة والبيئة التي تم تعريفها بها. وظيفة "المغلقة" في حد ذاته بعض المعلومات الواردة في النطاق.

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

Source: https://habr.com/ru/post/ar460861/


All Articles