"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > سياق التنفيذ ومكدس الاستدعاءات

سياق التنفيذ ومكدس الاستدعاءات

تم النشر بتاريخ 2024-11-08
تصفح:965

Execution Context & Call Stack

إنشاء سياق تنفيذ عالمي لرمز المستوى الأعلى، أي الكود الذي لا يوجد داخل أي fn. وبالتالي، يتم تنفيذ التعليمات البرمجية خارج fn أولاً.
يتم تنفيذ الكود الموجود داخل نص fn الخاص بـ fn-decln/exprsn فقط عند استدعائه.

سياق التنفيذ (EC)

البيئة التي يتم فيها تنفيذ جزء JS.
يخزن كافة المعلومات اللازمة لبعض التعليمات البرمجية التي سيتم تنفيذها مثل المتغيرات المحلية، والوسيطات التي يتم تمريرها إلى fn.
يعمل رمز JS دائمًا داخل EC.
بالضبط EC عالمي واحد بغض النظر عن حجم مشروع JS.
السياق الافتراضي، تم إنشاؤه للتعليمات البرمجية غير الموجودة داخل أي fn.
ثم يتم تنفيذ الكود داخل EC العالمية
بعد تنفيذ كود المستوى الأعلى، تنفيذ fns وانتظار C/bs
لكل مكالمة fn، يتم إنشاء EC جديد لتنفيذ ذلك fn. الأمر نفسه ينطبق على الأساليب، لأنها أيضًا مرتبطة بالكائنات.
تشكل كل هذه ECs معًا Call Stack.
عند تنفيذ جميع fns، ينتظر المحرك وصول CBs وتنفيذها. السابق. انقر فوق رد اتصال الحدث، الذي توفره حلقة الحدث.

ماذا يوجد داخل EC

  1. بيئة متغيرة تتكون من
  2. تصريحات Let، const، var
  3. الوظائف
  4. كائن الوسائط: يخزن جميع الوسائط التي تم تمريرها إلى fn في EC الخاصة بها.
    كل fn يحصل على EC الخاصة به كما يطلق عليه. والمتغيرات المعلنة تنتهي في بيئة متغيرة

  5. سلسلة النطاق:
    يمكن لـ Fns الوصول إلى المتغيرات خارج fns باستخدام سلسلة النطاق.
    يحتوي على إشارات إلى المتغيرات الموجودة خارج fn الحالي ولمتابعة سلسلة النطاق، يتم تخزينها في كل EC.

  6. تحصل كل EC أيضًا على الكلمة الأساسية "هذا".

يتم إنشاء كل هذه العناصر الثلاثة المذكورة أعلاه أثناء "مرحلة الإنشاء"، مباشرة قبل التنفيذ. هذه الأشياء الضرورية لتشغيل الكود في المستوى الأعلى.

بالنسبة للسهم fns EC:

لن يكون لدينا: كائن الوسائط، هذه الكلمة الأساسية. تستخدم fns السهم من أقرب fn عادي لها، وهما المذكوران أعلاه.

الوسائط: مصفوفة تشبه الكائن، تحتوي على جميع الوسائط التي تم تمريرها إلى fn العادي، وليس fn السهم.

استدعاء كومة الذاكرة المؤقتة = محرك JS

اتصل بـ ستاك

المكان الذي يتم فيه تكديس ECs فوق بعضها البعض، لتتبع ما وصلنا إليه في التنفيذ. أعلى EC هو الذي نقوم بتشغيله. عند انتهاء التنفيذ، تتم إزالته من أعلى المكدس ويتم نقل التحكم إلى EC الأساسي.
إذا كان هناك استدعاء fn متداخل، فسيتم إيقاف استدعاء fn الخارجي مؤقتًا لإرجاع نتيجة تنفيذ fn الداخلي على مكدس الاستدعاءات نظرًا لأن JS لديه مؤشر ترابط واحد فقط للتنفيذ. الآن ستصبح EC السابقة هي EC النشطة
ثم يتم إخراج أعلى EC من Call Stack عند إرجاعه.
سيكون أدنى مستوى في Call Stack هو EC العالمي، وفي الأعلى سيكون مكالمات fn عند حدوثها بالترتيب.
يضمن عدم فقدان ترتيب التنفيذ أبدًا.
في النهاية، سيتم الانتهاء من البرنامج وسيتم أيضًا إخراج EC العالمية من Call Stack.

يتم تشغيل رمز JS داخل 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 المتداخلة من خارج 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 به. لا يؤثر على سلسلة النطاق على الإطلاق.
عندما لا يتم العثور على متغير في النطاق الحالي، يبحث المحرك في سلسلة النطاق حتى يجد المتغير الذي يبحث عنه. وهذا ما يسمى بالبحث المتغير.

بيان الافراج تتم إعادة طباعة هذه المقالة على: https://dev.to/mahf001/execution-context-call-stack-29kp؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3