إنشاء سياق تنفيذ عالمي لرمز المستوى الأعلى، أي الكود الذي لا يوجد داخل أي fn. وبالتالي، يتم تنفيذ التعليمات البرمجية خارج fn أولاً.
يتم تنفيذ الكود الموجود داخل نص fn الخاص بـ fn-decln/exprsn فقط عند استدعائه.
البيئة التي يتم فيها تنفيذ جزء JS.
يخزن كافة المعلومات اللازمة لبعض التعليمات البرمجية التي سيتم تنفيذها مثل المتغيرات المحلية، والوسيطات التي يتم تمريرها إلى fn.
يعمل رمز JS دائمًا داخل EC.
بالضبط EC عالمي واحد بغض النظر عن حجم مشروع JS.
السياق الافتراضي، تم إنشاؤه للتعليمات البرمجية غير الموجودة داخل أي fn.
ثم يتم تنفيذ الكود داخل EC العالمية
بعد تنفيذ كود المستوى الأعلى، تنفيذ fns وانتظار C/bs
لكل مكالمة fn، يتم إنشاء EC جديد لتنفيذ ذلك fn. الأمر نفسه ينطبق على الأساليب، لأنها أيضًا مرتبطة بالكائنات.
تشكل كل هذه ECs معًا Call Stack.
عند تنفيذ جميع fns، ينتظر المحرك وصول CBs وتنفيذها. السابق. انقر فوق رد اتصال الحدث، الذي توفره حلقة الحدث.
كائن الوسائط: يخزن جميع الوسائط التي تم تمريرها إلى fn في EC الخاصة بها.
كل fn يحصل على EC الخاصة به كما يطلق عليه. والمتغيرات المعلنة تنتهي في بيئة متغيرة
سلسلة النطاق:
يمكن لـ Fns الوصول إلى المتغيرات خارج fns باستخدام سلسلة النطاق.
يحتوي على إشارات إلى المتغيرات الموجودة خارج fn الحالي ولمتابعة سلسلة النطاق، يتم تخزينها في كل EC.
تحصل كل EC أيضًا على الكلمة الأساسية "هذا".
يتم إنشاء كل هذه العناصر الثلاثة المذكورة أعلاه أثناء "مرحلة الإنشاء"، مباشرة قبل التنفيذ. هذه الأشياء الضرورية لتشغيل الكود في المستوى الأعلى.
لن يكون لدينا: كائن الوسائط، هذه الكلمة الأساسية. تستخدم fns السهم من أقرب fn عادي لها، وهما المذكوران أعلاه.
الوسائط: مصفوفة تشبه الكائن، تحتوي على جميع الوسائط التي تم تمريرها إلى fn العادي، وليس fn السهم.
المكان الذي يتم فيه تكديس ECs فوق بعضها البعض، لتتبع ما وصلنا إليه في التنفيذ. أعلى EC هو الذي نقوم بتشغيله. عند انتهاء التنفيذ، تتم إزالته من أعلى المكدس ويتم نقل التحكم إلى EC الأساسي.
إذا كان هناك استدعاء fn متداخل، فسيتم إيقاف استدعاء fn الخارجي مؤقتًا لإرجاع نتيجة تنفيذ fn الداخلي على مكدس الاستدعاءات نظرًا لأن JS لديه مؤشر ترابط واحد فقط للتنفيذ. الآن ستصبح EC السابقة هي EC النشطة
ثم يتم إخراج أعلى EC من Call Stack عند إرجاعه.
سيكون أدنى مستوى في Call Stack هو EC العالمي، وفي الأعلى سيكون مكالمات fn عند حدوثها بالترتيب.
يضمن عدم فقدان ترتيب التنفيذ أبدًا.
في النهاية، سيتم الانتهاء من البرنامج وسيتم أيضًا إخراج EC العالمية من Call Stack.
Hence, we can say that each EC has: 1. Variable environment 2. Scope chain 3. 'this' keyword
كيف يتم تنظيم متغيرات برنامجنا والوصول إليها بواسطة محرك JS.
أين تعيش المتغيرات
أين يمكننا الوصول إلى متغيرات معينة وأين لا.
يحتوي JS على نطاق قانوني مما يعني أنه يتم التحكم في النطاق عن طريق وضع fns والكتل في الكود.
السابق. تتمتع fn المتداخلة بإمكانية الوصول إلى متغيرات fn الأصلية.
المساحة أو البيئة التي يتم فيها الإعلان عن متغير معين (بيئة متغيرة في حالة fns). إنه المتغير env الذي تم تخزينه في fns EC.
بالنسبة إلى fns، يكون كل من Var env وscope متماثلين.
Three scopes in JS are: 1. Global scope 2. Fn scope 3. Block scope [ES6]
النطاق هو المكان الذي يتم فيه الإعلان عن المتغيرات. وبالتالي، ينطبق هذا أيضًا على Fns، حيث أن fns هي مجرد قيم مخزنة في المتغيرات.
منطقة الكود الخاص بنا حيث يمكن الوصول إلى متغير معين.
## Global Scope: For top level code For variables declared outside of any fn or block which are accessible from everywhere Variables in this scope are at the top of scope chain. Hence, can be used by every nested scope.
## Fn Scope: Each fn has creates its own scope Variables are accessible ONLY inside fn, NOT outside. Else Reference Error Also called local scope Fn decln, exprsn, arrow all three create their own scopes. Only way to create scope using ES5 which had only fn & global scope.
## Block Scope: Introduced in ES6, not only fn but {} also create a scope known as block scope which work only for ES6 variables i.e let-const types. DOesn't work for variables declared with 'var' as its fn scoped. Variables accessible only inside block i.e {} This only applies to variables declared with let-const only. Fns are also block scoped in ES6 (only in strict mode, should be used) variables declared using 'var' will be accessible outside the block Scoped to the current fn or the global scope. var variables only care about fn, they ignore blocks. They end up in nearest fn scope.
إذا لم يجد fn المتغير في نطاقه، فإنه يبحث عن سلسلة النطاق لمعرفة المتغيرات في نطاقه الخارجي. تسمى هذه العملية بالبحث المتغير في سلسلة النطاق. هذا لا يعمل في الاتجاه المعاكس، أي أننا لا نستطيع الوصول إلى متغيرات أو نطاقات fn المتداخلة من خارج fn أو النطاقات الخارجية.
لا يمكن لنطاقات الأخوة الوصول إلى متغيرات بعضها البعض
فقط النطاق الأعمق يمكنه الوصول إلى نطاقاته الخارجية، وليس العكس.
يتم وضع EC واحد لكل fn بالترتيب الدقيق الذي يتم استدعاء fn فيه في Call Stack مع متغيراته داخل EC. توجد EC العالمية في الجزء السفلي من Call Stack
سلسلة النطاق:
الأمر كله يتعلق بالترتيب الذي تتم به كتابة fns في الكود.
لا علاقة له بالترتيب الذي تم استدعاء fns به.
تحصل سلسلة النطاق على البيئة المتغيرة من المجموعة الأوروبية.
ترتيب مكالمات fn ليس له علاقة بسلسلة النطاق على الإطلاق.
const a = 'Alice'; first(); function first(){ const b = "Hello"; second(); function second(){ const c = "Hi"; third(); } } function third(){ const d = "Hey"; console.log(d c b a); // Reference Error } ## Call Stack order: third() EC - top second() EC first() EC global EC - bottom Scope Chain: second() --nested inside--> first() --nested inside--> global scope. third() is independently defined inside gloabal scope. Reference Error occurred because both 'c' as well as 'b' cannot be accessed using the scope chain.
ملخص:
EC، Var Env، Cl-Sk، Scope، Scope-chain كلها مفاهيم مختلفة ولكنها مرتبطة ببعضها البعض.
يطرح تحديد النطاق أسئلة أين تعيش المتغيرات، وأين يمكننا الوصول إلى المتغيرات وأين لا.
النطاق المعجمي في JS: تعتمد القواعد التي يمكننا من خلالها الوصول إلى المتغيرات على المكان الذي تمت فيه كتابة fns والكتل في الكود.
كل نطاق لديه حق الوصول إلى جميع المتغيرات من جميع نطاقاته الخارجية. هذه سلسلة نطاق وهي شارع ذو اتجاه واحد. لا يمكن للنطاق الخارجي أبدًا الوصول إلى متغيرات النطاق الداخلي.
سلسلة النطاق لنطاق معين تساوي إضافة جميع Var Envs لجميع النطاقات الأصلية معًا.
سلسلة النطاق ليس لها علاقة بالترتيب الذي يتم استدعاء fns به. لا يؤثر على سلسلة النطاق على الإطلاق.
عندما لا يتم العثور على متغير في النطاق الحالي، يبحث المحرك في سلسلة النطاق حتى يجد المتغير الذي يبحث عنه. وهذا ما يسمى بالبحث المتغير.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3