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

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
بإغلاق. الإغلاق هو مزيج من الوظيفة والبيئة التي تم تعريفها بها. وظيفة "المغلقة" في حد ذاته بعض المعلومات الواردة في النطاق.
قد يبدو هذا غريباً في جافا سكريبت ، لكن استخدام عمليات الإغلاق بحكمة يمكن أن يساعد في جعل الكود أكثر متعة ونظيفة وقراءة. يمنحك مبدأ إرجاع الوظائف ، مثل إرجاع الأرقام وقيم السلسلة ، حرية أكبر في المناورة.