أولاً ، ما يلي ثلاثة رموز تشرح النطاق
. var scope = 'local' ؛ التنبيه (النطاق) ؛} fn () ؛ // نتيجة الإخراج؟ تنبيه (نطاق) ؛ // نتيجة الإخراج؟ . Scope = 'Local' ؛ التنبيه (النطاق) ؛} fn () ؛ // نتيجة الإخراج؟ تنبيه (نطاق) ؛ // نتيجة الإخراج؟ . Scope = 'Local' ؛ التنبيه (النطاق) ؛} fn () ؛ // نتيجة الإخراج؟ تنبيه (نطاق) ؛ // نتيجة الإخراج؟
هذه الرموز الثلاثة لها فرق صغير فقط ، لكن النتائج مختلفة تمامًا. مثال 1 مخرجات [غير محددة ، محلية ، عالمية] ، مثال 2 المخرجات [العالمية ، المحلية ، المحلية] ، مثال 3 مخرجات [غير محددة ، محلية ، عالمية]. إذا لم تتمكن من الإجابة بشكل صحيح ، فهذا يعني أنك لم تفهم بعد خصائص نطاق JavaScript.
ما هو النطاق؟
قد يسأل شخص ما: ما هو نطاق المتغير أ؟ سألت مرة أخرى لاحقًا: ما هو نطاق الوظيفة A؟ ما هي نطاقات المتغيرات والوظائف؟
دعونا نلقي نظرة أولاً على معنى "النطاق". عندما يتم تقسيم "النطاق" ، فهذا يعني "الوظيفة" و "المجال"
النطاق هو النطاق الذي يمكن الوصول إليه من المتغيرات والوظائف ، أو المنطقة التي تعمل فيها المتغيرات أو الوظائف.
1.Scope من وظيفة JavaScript:
المنطقة الواقعة في الوظيفة هي نطاق الوظيفة ، ويمكن لكل من المتغيرات والوظائف الوصول إلى العمليات في هذا المجال. تسمى المنطقة خارج الوظيفة الخارجية النطاق العالمي ، وتسمى المنطقة الموجودة داخل الوظيفة النطاق المحلي.
2. نطاق متغيرات JavaScript:
في المنطقة التي يوجد فيها المتغير في الكود المصدري ، يكون نطاق هذا المتغير ، ويمكن الوصول إلى المتغير وتشغيله في هذه المنطقة. تسمى المتغيرات المحددة في النطاق العالمي المتغيرات العالمية ، وتسمى المتغيرات المحددة في الوظيفة المتغيرات المحلية.
لفهم ببساطة ، يتم تقسيم رمز مصدر JS إلى مناطق الكتلة حسب الوظيفة {}. إذا غيرت هذه المناطق هويتها ، فهي نطاق وظيفة معينة أو متغير معين. قد يشير نطاق المتغير ونطاق الوظيفة إلى نفس المنطقة في الكود المصدري.
سلسلة النطاق
سلسلة النطاق هي آلية بحث متغير ووظائف داخل JavaScript. وهو يحدد نطاق المتغيرات والوظائف ، أي النطاق. فهم مبدأ سلسلة النطاق ، ويمكنك فهم الأمثلة الثلاثة في المقالة السابقة ، بحيث يمكنك معرفة السبب والسبب.
سلسلة SCOPE هي مفهوم في وثائق ECMASCRIPT-262. يتم تنفيذ محرك JavaScript وفقًا لوثائق ECMASCRIPT-262. إن فهم مبدأ العمل لمحرك JavaScript يفضي إلى فهمنا لخصائص JavaScript ، لكن معظم مبرمجي JS لن يفهموا التقنيات الأساسية للغاية. لذلك ، عند قراءة وثائق ECMASCRIPT-262 ، يمكننا أن يكون لدينا طريقة بديهية لمحاكاة مبدأ العمل لمحرك JavaScript.
ستشرح هذه المقالة مبدأ تشكيل سلاسل النطاق من خلال الإصدار الثالث من ECMASCRIPT-262-3th في عام 1999 ، وستقدم العديد من المفاهيم مثل بيئة التنفيذ ، والكائنات المتغيرة والكائنات النشطة ، وكائنات الوسائط ، وسلاسل النطاق ، وما إلى ذلك ، في عام 2009 ، تم إصدار الطبعة الخامسة من ECMASSCRIPT-262-5th. كان الفرق هو أنه تم إلغاء مفاهيم مثل الكائنات المتغيرة والكائنات النشطة ، وتم تقديم مفاهيم جديدة مثل البيئات المعجمية وسجلات البيئة ، لذلك لا تخلط بين مفاهيم الإصدارين.
1. سياقات Execution
تتم ترجمة سياقات التنفيذ أيضًا إلى سياق التنفيذ. عندما يدخل المحلل في الكود القابل للتنفيذ لـ ECMASCRIPT ، يدخل المحلل البيئي في بيئة تنفيذ. بيئة التنفيذ النشطة تشكل مجموعة منطقية. بيئة التنفيذ في الجزء العلوي من هذه المكدس المنطقي هي بيئة التنفيذ الحالية.
ملاحظة: هناك ثلاثة أنواع من التعليمات البرمجية القابلة للتنفيذ في ECMASCRIPT ، GLOBAL ، الوظيفة والتقييم. البيئة العالمية هي رمز قابلة للتنفيذ عالمي ، والوظائف هي رمز قابل للتنفيذ. المكدس المنطقي هو تنسيق خاص لتخزين البيانات ، ويتميز بـ "الأول داخل وخارج ، ثم داخل وخارج". سيتم أولاً دفع إضافة البيانات إلى أعلى مكدس المنطق ، ويجب حذف البيانات من الأعلى.
كائن متغير ، كائن نشط ، ووسائط الكائن
كل بيئة تنفيذ لديها كائن متغير مرتبط به. عندما يدخل المحلل في بيئة التنفيذ ، سيتم إنشاء كائن متغير ، والذي يحمل إشارات إلى المتغيرات والوظائف المعلنة في بيئة التنفيذ الحالية.
الكائن المتغير هو مفهوم مجردة. في بيئات التنفيذ المختلفة ، يكون للكائنات المتغيرة هويات مختلفة. قبل أن يدخل المحلل أي بيئة تنفيذ ، يتم إنشاء كائن عالمي. عندما يدخل المحلل في بيئة التنفيذ العالمية ، يعمل الكائن العالمي ككائن متغير. عندما يدخل المحلل في وظيفة ، سيتم إنشاء كائن نشط ككائن متغير.
2. مرحلتان عندما يعالج المحلل الرمز الكود
نعلم جميعًا أن JavaScript Parser يحلل الرمز الأول تلو الآخر ، هل هو حصيرة؟ يتضمن ذلك مرحلتين عندما يقوم المحلل بمعالجة الكود ، وتحليل الرمز وتنفيذ الرمز.
عندما يدخل المحلل إلى بيئة التنفيذ ، سيضيف الكائن المتغير المتغيرات والوظائف المعلنة في بيئة التنفيذ كخصائصه ، مما يعني أن المتغيرات والوظائف متوفرة قبل الإعلان ، وأن القيمة المتغيرة غير محددة. هذا هو السبب في تعزيز المتغيرات وإعلانات الوظيفة (الرفع). في الوقت نفسه ، يتم تحديد سلسلة النطاق وهذا محدد. هذه العملية هي مرحلة التحليل ، والمعروفة عادة باسم ما قبل الإرهاق. ثم يبدأ المحللون في تنفيذ الرمز ، ويضيف مرجعًا إلى القيمة المقابلة للمتغير ، ويحصل على نتيجة التنفيذ. هذه العملية هي مرحلة التنفيذ.
دعنا نسمي اثنين من الكستناء اللذيذ:
var a = 123 ؛ var b = "abc" ؛ function c () {Alert ('11 ') ؛}بعد تحليل الكود والتنفيذ في البيئة العالمية أعلاه ، سيتم استخدام الكائن العالمي ككائن متغير وسيتم حفظ البيانات التالية.
وظيفة testfn (a) {var b = "123" ؛ الدالة C () {Alert ("ABC") ؛ }} testfn (10) ؛عندما يدخل المحلل إلى بيئة تنفيذ الوظيفة ، سيتم إنشاء كائن نشط ككائن متغير. سيقوم الكائن النشط أيضًا بإنشاء كائن وسيطات. كائن الوسائط هو معلمة تعيين لحفظ المعلمات. لهذا السبب يمكننا استخدام الوسائط [0] وما إلى ذلك عند الكتابة.
3. سلسلة النطاق
كل بيئة تنفيذ لها سلسلة نطاق مرتبطة بها. يتم تعريفه عندما يدخل المحلل في بيئة التنفيذ. سلسلة النطاق هي قائمة كائنات تستخدم لاسترداد المتغيرات والوظائف في كل كائن متغير. هذا يضمن أن بيئة التنفيذ لها الحق في الوصول إلى المتغيرات والوظائف. على سبيل المثال ، إنه كستناء.
var a = '123' ؛ function testfn (b) {var c = 'abc' ؛ وظيفة testfn2 () {var d = 'efg' ؛ تنبيه (أ) ؛ } testfn2 () ؛} testfn (10) ؛لم يتم الإعلان عن المتغير A في testfn2. لماذا يمكن testfn2 استدعاء المتغير العالمي A؟ كيف حدثت العملية برمتها؟ يرجى الاطلاع على الصورة أدناه.
عندما يدخل المحلل في بيئة التنفيذ العالمية ، يتم العثور على المتغيرات والوظائف فقط في الكائن العالمي عند الاتصال بها.
عندما يدخل المحلل البيئي إلى بيئة تنفيذ دالة testfn ، يتم ملء الخاصية الداخلية للدالة [[النطاق]] أولاً في الكائن العالمي ، ثم تتم إضافة كائن نشط testfn إلى الكائن العالمي لتشكيل سلسلة نطاق.
عندما يدخل المحلل المحلل في بيئة تنفيذ دالة TestFN2 ، يتم ملء الخاصية الداخلية للدالة [[النطاق]] أولاً في سلسلة نطاق الوالدين ، ثم يضاف كائن TestFn2 الحالي إلى الطرف الأمامي لسلسلة النطاق لتشكيل سلسلة نطاق جديدة.
عند استدعاء TestFn2 المتغير A ، قم بالبحث أولاً في الكائن النشط TestFn2 الحالي. إذا لم يتم العثور عليه ، اتبع سلسلة النطاق لأعلى. إذا لم يتم العثور عليها ، ابحث عن سلسلة النطاق. إذا لم يتم العثور عليها ، فابحث عن سلسلة النطاق حتى يتم العثور عليها في الكائن العالمي الأخير ، وإلا سيتم الإبلاغ عن خطأ. لذلك ، يمكن استدعاء متغيرات البيئة الخارجية داخل الوظيفة ، ولا يمكن استدعاء متغيرات البيئة الخارجية داخل الوظيفة. هذا هو مبدأ خصائص النطاق.