تحدد بيئة التنفيذ البيانات الأخرى التي تحتوي المتغيرات أو الوظائف على إذن للوصول ، وتحدد سلوكها. كل بيئة تنفيذ لديها كائن متغير مرتبط به.
بيئة التنفيذ العالمية هي بيئة التنفيذ الأكثر طرفية. اعتمادًا على البيئة المضيفة التي يوجد فيها تطبيق JavaScript ، تختلف الكائنات التي تمثل بيئة التنفيذ أيضًا. في متصفح الويب ، تعتبر بيئة التنفيذ العالمية كائن نافذة. لذلك ، يتم إنشاء جميع المتغيرات والوظائف العالمية كخصائص وطرق كائنات النوافذ.
كائن متغير: يتم تخزين جميع المتغيرات والوظائف المحددة في البيئة في هذا الكائن.
سلسلة النطاق: عندما يتم تنفيذ الكود في بيئة ، يتم إنشاء سلسلة نطاق من الكائنات المتغيرة. الغرض من سلسلة النطاق هو ضمان الوصول المنظم إلى جميع المتغيرات والوظائف التي لديها إذن للوصول إلى بيئة التنفيذ. تعد الواجهة الأمامية لسلسلة النطاق دائمًا كائنًا متغيرًا في البيئة حيث يوجد الكود الذي يتم تنفيذه حاليًا.
الكائن النشط: يحتوي الكائن النشط فقط على متغير واحد في البداية ، أي كائن الوسائط. يأتي الكائن المتغير التالي في سلسلة النطاق من بيئة التضمين (الخارجية) ، ويأتي الكائن المتغير التالي من بيئة التضمين التالية. يستمر هذا في بيئة التنفيذ العالمية ؛ الكائنات المتغيرة لبيئة التنفيذ العالمية هي دائمًا الكائن الأخير في سلسلة النطاق.
تحليل المعرف: تحليل المعرف هو عملية للبحث عن معرفات واحدة تلو الأخرى على طول سلسلة النطاق. تبدأ عملية البحث دائمًا من الطرف الأمامي لسلسلة النطاق ثم تعود خطوة بخطوة حتى يتم العثور على المعرف.
نموذج الرمز:
var color = "Blue" ؛ function changeColor () {if (color === "blue") {color = "red" ؛ } آخر {color = "Blue" ؛ }} changeColor () ؛ Alert ("اللون الآن" + اللون) ؛تحتوي سلسلة نطاق الوظيفة changeColor () على كائنين: كائن متغير خاص به (والذي يحدد كائن الوسائط) وكائن متغير للمتغيرات العالمية. يمكن الوصول إلى اللون المتغير داخل الوظيفة لأنه يمكن العثور عليه في سلسلة النطاق هذه.
بالإضافة إلى ذلك ، يمكن استخدام المتغيرات المحددة في النطاقات المحلية بالتبادل مع المتغيرات العالمية في بيئة محلية ، على سبيل المثال:
var color = "blue" ؛ function changeColor () {var analyColor = "Red" ؛ دالة swapcolors () {var tempcolor = analleColor ؛ analycolor = اللون ؛ اللون = tempcolor ؛ // يمكنك الوصول إلى اللون ، ألوان أخرى و tempcolor هنا} // يمكنك الوصول إلى اللون وألوان أخرى هنا ، ولكن لا يمكنك الوصول إلى swapcolors tempcolor () ؛} // فقط يمكنك الوصول إلى ColorChangecolor () ؛يتضمن الكود أعلاه 3 بيئات تنفيذ: البيئة العالمية ، وبيئة مقبض ChangeColor () والبيئة المحلية لـ Swapcolors ().
هناك لون متغير ودالة changeColor () في المتغير العالمي. يحتوي المتغير المحلي لـ ChangeColor () على ألوان أخرى متغيرة ودالة SwapColors () ، والتي يمكنها الوصول إلى اللون في المتغير العالمي. هناك متغير tempcolor في المتغير المحلي من swapcolors (). في swapcolors () ، يمكنك الوصول إلى اللون في المتغير العالمي ، أو المتغير الآخر للألوان ، لأن هاتين البيئتين هما بيئة تنفيذ الأم. سلسلة نطاق المثال أعلاه هي:
من بينها ، يمكن للبيئة الداخلية الوصول إلى جميع البيئات الخارجية من خلال سلسلة النطاق ، ولكن لا يمكن للبيئة الخارجية الوصول إلى أي متغيرات ووظائف في البيئة الداخلية . الروابط بين متغيرات البيئة خطية وتتابع. لا يمكن لكل متغير البحث عن سلسلة النطاق فقط من العليا في الاستعلام عن المتغير واسم الوظيفة ، أي أولاً الاستعلام عن اسم المتغير أو الوظيفة في هذه الوظيفة ، وإذا لم يتم الاستعلام عنه إلى سلسلة النطاق السابقة حتى النطاق العلوي. ومع ذلك ، لا يمكن لأي بيئة البحث في سلسلة النطاق وإدخال بيئة تنفيذ أخرى.
يتم التعامل مع معلمات الوظائف أيضًا كمتغيرات ، وبالتالي فإن قواعد الوصول الخاصة بها هي نفس المتغيرات الأخرى في بيئة التنفيذ.
1. تمديد سلسلة النطاق
يتم تمديد سلسلة النطاق عندما يدخل تدفق التنفيذ في أي من العبارات التالية:
• Catch Block of Try-Catch Brage
• مع البيان
سيضيف هذان البيانان كائن متغير إلى الطرف الأمامي للنطاق.
بالنسبة للبيان مع ، تتم إضافة المتغير المحدد إلى سلسلة النطاق. بالنسبة لبيان الصيد ، يتم إنشاء كائن متغير جديد ، والذي يحتوي على إعلان الكائن الخطأ الذي يتم طرحه.
على سبيل المثال:
دالة buildurl () {var qs = "؟ debug = true" ؛ مع (الموقع) {var url = href + qs ؛ } url url ؛}يتلقى العبارة مع كائن موقع ، لذلك يحتوي كائنه المتغير على الخصائص والطرق المستخدمة من قبل كائن الموقع ، ويتم إضافة هذا الكائن المتغير إلى الطرف الأمامي لسلسلة النطاق. عند الإشارة إلى المتغير HREF في البيان (في الواقع يشير إلى الموقع. href) ، يمكن العثور عليه في متغير البيئة الحالي. عند الإشارة إلى المتغير QS ، يتم الرجوع إلى المتغير المحدد في buildurl () ، والذي يقع في كائن متغير بيئة الوظيفة. بالنسبة للبيان مع ، يتم تعريف متغير عنوان URL ، لذلك يصبح عنوان URL جزءًا من بيئة تنفيذ الوظائف ويمكن إرجاعه كقيمة الوظيفة.
2. لا يوجد نطاق على مستوى الكتلة
في JavaScript ، لا يوجد نطاق أقواس مجعد مغلقة. انظر إلى الكود التالي:
if (true) {var color = "Blue" ؛} ALERT (color) ؛ // "أزرق"في JavaScript ، يضيف الإعلان المتغير الذي تم إنشاؤه بواسطة If/for بيان المتغير إلى بيئة التنفيذ الحالية. على سبيل المثال:
لـ (var i = 0 ؛ i <10 ؛ i ++) {dosomething (i) ؛} ALERT (i) ؛ // 10إعادة تدوير القمامة
على غرار Java ، لدى JavaScript أيضًا آلية إعادة تدوير القمامة التلقائية. بيئة التنفيذ مسؤولة عن إدارة الذاكرة المستخدمة أثناء تنفيذ الكود. عند كتابة البرامج ، ليست هناك حاجة لمشكلات استخدام الذاكرة ذات الصلة. يتم تنفيذ تخصيص الذاكرة المطلوبة وإعادة تدوير الذاكرة غير المجدية بالكامل. مبدأ آلية جمع القمامة هو: اكتشف المتغيرات التي لم تعد تستخدم ، ثم تحرير الذاكرة التي تشغلها. للقيام بذلك ، سيقوم جامع القمامة بإجراء هذه العملية بشكل دوري في فترة زمنية ثابتة (أو وقت جمع محدد مسبقًا أثناء تنفيذ الكود).
قبل القيام بجمع القمامة ، يجب عليك تحديد ما إذا كان المورد عديم الفائدة وأن علامة المتغيرات التي لم تعد تستخدم من أجل إعادة تدوير ذاكرتها في المستقبل. عادة ما يكون هناك تطبيقان لاستراتيجيات لتحديد المتغيرات عديمة الفائدة.
1 مارك واضح
الطريقة الأكثر شيوعًا لجمع القمامة في JavaScript هي تنظيف العلامات. عندما يدخل المتغير إلى البيئة ، يتم تمييزه على أنه "أدخل البيئة" ؛ عندما يترك المتغير البيئة ، يتم تمييزه على أنه "الخروج من البيئة". عندما يعمل جامع القمامة ، فإنه يمثل جميع المتغيرات المستخدمة. ثم يزيل علامات المتغيرات في البيئة والمتغيرات المشار إليها من قبل المتغيرات في البيئة. بعد ذلك ، سيتم اعتبار المتغيرات الموسومة متغيرات جاهزة للحذف. أخيرًا ، يكمل جامع القمامة أعمال تطهير الذاكرة ، ويدمر القيم الملحوظة ويعيد إعادة تدوير مساحة الذاكرة التي يشغلونها.
2. عدد المرجع
يشير عدد المرجع إلى عدد مرات الرجوع إلى كل قيمة. عندما يتم الإعلان عن متغير وتخصيص قيمة نوع المرجع للمتغير ، فإن عدد المراجع إلى هذه القيمة هو 1. إذا تم تعيين نفس القيمة لمتغير آخر ، يتم زيادة عدد المراجع إلى القيمة بنسبة 1. يمكن استرداد مساحة الذاكرة الخاصة بها. في المرة التالية التي يعمل فيها جامع القمامة ، يقوم بإعادة تدوير الذاكرة التي تشغلها هذه القيم مع مراجع صفر.
إحدى المشكلات التي يمكن أن تسبب العد المرجعية المراجع المعاد تدويرها. على سبيل المثال:
وظيفة problem () {var obja = new Object () ؛ var objb = new Object () ؛ obja.someotheroBJ = objb ؛ objb.someotherobj = obja ؛}في المثال أعلاه ، يشير OBJA و OBJB إلى بعضهما البعض من خلال السمات. بعد الانتهاء من تنفيذ الوظيفة ، سيستمر OBJA و OBJB في الوجود ولن يكون عددهم المرجعي 0. سيؤدي هذا الموقف إلى إعادة تدوير الذاكرة التي يشغلها OBJA و OBJB.
تتحدث المقالة أعلاه لفترة وجيزة عن JavaScript: بيئة التنفيذ ، نطاق وجمع القمامة هي كلها المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.