دعونا نتحدث أولاً عن ماهية تجزئة الكلمات وهي تحليل سلسلة من الأحرف إلى كتل برمجية ذات معنى للغة البرمجة. تسمى كتل التعليمات البرمجية هذه الرموز المميزة. على سبيل المثال، سيتم تقسيم الكود var a = 2
إلى الوحدات المعجمية التالية. على وجه التحديد: var,a,=,2.
ملحوظة: تجزئة الكلمات هي في الواقع تقسيم الكود أعلاه بالكامل إلى أجزاء.
الإعراب هو تحويل سلسلة الوحدات المعجمية إلى شجرة مكونة من عناصر متداخلة مستوى تلو الآخر، والتي تمثل البنية النحوية للبرنامج. تسمى هذه الشجرة: شجرة بناء الجملة المجردة. ونظرًا للكلمات القياسية الطويلة جدًا هنا، فلن نأخذها في الاعتبار، وسأعرضها مباشرةً في شكل أكثر سهولة. التفاصيل هي كما يلي:
التحليل: ستحتوي شجرة بناء الجملة المجردة على عقدة ذات مستوى أعلى من var، تليها عقدة فرعية مع المتغير a وعقدة مع عامل التعيين =. توجد عقدة فرعية أخرى بقيمة 2 تحت رمز المهمة. على وجه التحديد، يتوافق مع الكود var a = 2
.
تسمى عملية تحويل شجرة بناء الجملة المجردة إلى تعليمات برمجية قابلة للتنفيذ بإنشاء التعليمات البرمجية. ترتبط هذه العملية ارتباطًا وثيقًا باللغة والمنصة المستهدفة. ببساطة، هناك طريقة لتحويل شجرة بناء الجملة المجردة var a = 2
إلى تعليمات الآلة. يستخدم لإنشاء متغير يسمى a وتخزين قيمة في a.
بشكل أساسي على المحرك لتنفيذ تعليمات JavaScript البرمجية. عندما ينفذ المحرك var a = 2، فإنه سيحدد ما إذا كان قد تم الإعلان عن المتغير a من خلال البحث عنه. تتم مساعدة عملية البحث عن طريق النطاقات. أثناء عملية الاستعلام، سيقوم المحرك بإجراء LHS (الاستعلام الأيسر) للمتغير a والاستعلام الأيمن عن القيمة. لتبسيط الأمر، عندما يظهر المتغير على الجانب الأيسر من عملية التعيين، يتم تنفيذ استعلام LHS، وعندما يظهر على الجانب الأيمن، يتم تنفيذ استعلام RHS. لكي نكون أكثر دقة، يحاول استعلام LHS العثور على حاوية المتغير نفسه، بينما يحاول استعلام RHS الحصول على قيمة المصدر الخاصة به.
ملاحظة: في الوظيفة، سيكون هناك استعلامات LHS وRHS. لأنه أثناء عملية تمرير المعلمات، سيقوم الكود بتنفيذ مهمة ضمنية.
عندما لا يتم الإعلان عن المتغير، يختلف سلوك استعلام LHS واستعلام RHS.
وظيفة فو (أ) { console.log(a+b); b=a;}foo(2)
ملاحظة: لا يمكن للاستعلام الصحيح الأول في b العثور على المتغير، مما يعني أنه متغير غير معلن لأنه لا يمكن العثور عليه في أي نطاق ذي صلة. إذا لم يتمكن RHS من العثور على المتغيرات المطلوبة في النطاق المتداخل، فسيطرح المحرك استثناءً.
foo(a){ فار ب=أ; العودة أ+ب؛ }
مشكلة
var c=foo(2): ابحث عن جميع استعلامات LHS وRHS
الإجابة: LHS(c=…,a=2,b=…) وRHS(foo(2…,=a,a…,…b))