الكلمات السابقة
في معظم الأوقات ، فإن السبب الرئيسي وراء الخلط بيننا بشأن النطاق هو أنه لا يمكننا التمييز بين ما إذا كان ينبغي إجراء عمليات البحث المتغيرة بترتيب متداخل لمواضع الوظائف أو بترتيب مكالمات الوظائف. إلى جانب تداخل هذه الآلية ، البحث المتغير معرض للغاية للأخطاء. هذا هو في الواقع ناتج عن طرازين العمل النطاقين. ينقسم النطاق إلى نطاق معجمي ونطاق ديناميكي. من خلال التمييز بين هذين النموذجين النطاقين ، يمكنك أن يكون لديك فهم واضح لعملية البحث المتغيرة. هذه المقالة هي الفصل الثاني من سلسلة JavaScript Scope - النطاق المعجمي والنطاق الديناميكي
النطاق المعجمي
كما هو مذكور في المقالة الأولى ، تسمى المرحلة العاملة الأولى من برنامج التحويل البرمجي Word Gollle ، والتي تحلل سلسلة مكونة من الأحرف إلى وحدات معجمية. هذا المفهوم هو الأساس لفهم النطاق المعجمي
ببساطة ، يحدد النطاق المعجمي النطاق في المرحلة المعجمية ، والذي يتم تحديده من خلال المكان الذي تتم فيه كتابة المتغيرات ونطاق الكتلة عند كتابة الرمز. لذلك ، يبقى النطاق دون تغيير عندما يعالج المحلل المعجمي الرمز.
العلاقة
بغض النظر عن المكان الذي يتم فيه استدعاء الوظيفة ، وبغض النظر عن كيفية استدعاؤها ، يتم تحديد نطاقها المعجمي فقط من خلال الموضع الذي يتم فيه الإعلان عن الوظيفة.
دالة foo (a) {var b = a * 2 ؛ شريط الدالة (c) {console.log (a ، b ، c) ؛} bar (b * 3) ؛} foo (2) ؛ // 2 4 12في هذا المثال ، هناك ثلاثة نطاقات متداخلة. للمساعدة في الفهم ، فكر فيها على أنه العديد من الفقاعات التي يتم تضمينها خطوة بخطوة
يتم تحديد فقاعات النطاق من خلال حيث يتم كتابة رمز كتلة نطاقها المقابل ، ويتم تضمينها خطوة بخطوة.
تحتوي الفقاعة 1 على النطاق العالمي بأكمله ، مع معرف واحد فقط: فو
تحتوي الفقاعة 2 على النطاق الذي أنشأته FOO ، والذي يحتوي على ثلاثة معرفات: A ، و BAR ، و B.
تحتوي الفقاعة 3 على النطاق الذي تم إنشاؤه بواسطة Bar ، مع معرف واحد فقط: C
يجد
يوفر هيكل الفقاعات المنحدر وعلاقاتها الموضعية للمحرك معلومات كافية للموضع ، والتي يستخدمها المحرك للعثور على موقع المعرف.
في مقتطف الكود ، يقوم المحرك بتنفيذ إعلان Console.log (...) ويبحث عن إشارات إلى المتغيرات الثلاثة A و B و C. يبدأ أولاً بنطاق الأعمق ، أي نطاق وظيفة الشريط (...). لا يمكن للمحرك العثور على A هنا ، لذلك سوف يذهب إلى المستوى السابق لمواصلة البحث في نطاق FOO المتداخل (...). تم العثور على A هنا ، لذلك يستخدم المحرك هذا المرجع. الشيء نفسه ينطبق على ب. وبالنسبة لـ C ، وجد المحرك في الشريط (...)
[ملاحظة] سوف يبحث البحث عن نطاق معجمي فقط عن معرفات المستوى الأول. إذا كان الكود يشير إلى foo.bar.baz ، فسيحاول بحث النطاق المعجمي فقط العثور على معرفات FOO. بعد العثور على هذا المتغير ، تتولى قواعد الوصول إلى سمة الكائن الوصول إلى سمات الشريط والباز على التوالي
foo = {bar: {baz: 1}} ؛ console.log (foo.bar.baz) ؛ // 1غطاء
يبدأ البحث في نطاق من نطاق الأعمق الذي يوجد فيه وقت التشغيل ، ويستمر خطوة بخطوة إلى الخارج أو لأعلى حتى يتم استيفاء المعرف المطابق الأول.
يمكن تعريف المعرفات التي تحمل نفس الاسم في نطاقات متداخلة متعددة الطبقات ، والتي تسمى "تأثير انسداد". المعرفات الداخلية "عدوى" معرفات خارجية
var a = 0 ؛ test test () {var a = 1 ؛ console.log (a) ؛ // 1} test () ؛المتغيرات العالمية هي تلقائيًا سمات للكائنات العالمية ، بحيث يمكن الوصول إليها مباشرة بالرجوع إلى سمات الكائنات العالمية بدلاً من المرور مباشرة عبر الاسم المعجمي للكائن العالمي.
var a = 0 ؛ test test () {var a = 1 ؛ console.log (window.a) ؛ // 0} test () ؛تتيح هذه التقنية الوصول إلى المتغيرات العالمية التي تحجبها المتغيرات التي تحمل نفس الاسم. ولكن إذا تم حظر المتغيرات غير العارضة ، فلا يمكن الوصول إليها بغض النظر عن ذلك.
النطاق الديناميكي
تستخدم JavaScript النطاق المعجمي ، وأهم ميزة لها هي أن عملية التعريف الخاصة بها تحدث خلال مرحلة الكتابة من الكود.
ثم لماذا تقديم النطاق الديناميكي؟ في الواقع ، النطاق الديناميكي هو آلية مهمة أخرى لجافا سكريبت لابنة عم هذا. معظم ارتباك النطاق هو أن النطاق المعجمي وهذه الآلية مرتبكون ، لذلك لا يمكنني معرفة الفرق بين بغباء
لا تهتم النطاقات الديناميكية بكيفية إعلان وظائف النطاقات وإعلانها في أي مكان ، فقط من أين يتم استدعاؤها. بمعنى آخر ، تعتمد سلاسل النطاق على مكدس المكالمات ، وليس النطاق التعشيش في الكود
var a = 2 ؛ function foo () {console.log (a) ؛} function bar () {var a = 3 ؛ foo () ؛} bar () ؛[1] إذا كان في النطاق المعجمي ، فهي بيئة جافا سكريبت الحالية. يتم البحث عن المتغير A لأول مرة في وظيفة Foo () ، ولكن لم يتم العثور عليها. لذا اتبع سلسلة النطاق للبحث في النطاق العالمي ، ابحث عن قيمة 2.
【2】 إذا كان في النطاق الديناميكي ، وبالمثل ، يتم البحث عن المتغير A لأول مرة في Foo () ولم يتم العثور عليه. هنا ، ستتبع مكدس الاتصال للبحث في المكان الذي تسمى وظيفة FOO () ، أي وظيفة الشريط () ، ابحث عن القيمة إلى 3.
ملخص: الفرق بين النطاقين. باختصار ، يتم تحديد النطاق المعجمي في وقت التعريف ، بينما يتم تحديد النطاق الديناميكي في وقت التشغيل.
ما سبق هو الجزء الثاني من النطاق المعجمي والنطاق الديناميكي الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كنت تريد معرفة المزيد ، فيرجى الانتباه إلى wulin.com!