14 - جاوااسکریپت: Function Invocation and the Execution Stack

تا قبل از این فقط در مورد global execution context صحبت کردیم. تعریف invocation: اجرا (صدا) کردن یک تابع.میخوایم بدونیم وقتی تابعی رو invoce میکنیم چه اتفاقی میفته. مثلا داریم:function b() { }function a() { b(); }a();وقتی این کد میخواد اجرا بشه اول global execution context اجرا میشه. به این صورت که در مرحله اول parser کد را parse میکند و سپس کامپایلر یک execution context ایجاد میکند. global object و this ایجاد میشوند و این تابع ها به آن attach میشوند و برای آنها حافظه در نظر گرفته میشود. سپس کد خط به خط اجرا میشود.به a(); که میرسیم یک execution context جدید ایجاد میشود و در یک execution stack بالای global execution context قرار میگیرد. هر چیزی که بالای stack باشد در حال اجرا است. بنابراین هر موقع که تابعی را invoce میکنیم یک execution context ایجاد میشود و بالای execution context stack قرار میگیرد.هر execution context جدید حافظه خودش را برای متغیرها و تابع هایش دارد و سپس کدهای داخل تابع را خط به خط اجرا میکند. اگر در این کدها یک تابع دیگر هم صدا زده شود، اجرای کدهای داخل تابع متوقف میشود و یک execution context دیگه بالای استک ایجاد میشود.هر تابع یک execution context جدید ایجاد میکند.وقتی اجرای تابع تمام شد، چون بالای استک است، از استک pop میشود.جای فیزیکی تابع ها در کد مهم نیست. همچنین کدهای اطراف فراخوانی تابع هم مهم نیستند. برای مثال:function a(){ b(); var c; }function b(){ var d; }a();var d;در این کد تابع a را بالای تابع b گذاشتیم و اطراف invoce کردن تابع b کدهای دیگه ای هم داریم. گرچه a بالای b است، هر دوی این تابع ها در حافظه قرار میگیرند وقتی global execution context ایجاد میشود.اول a(); اجرا میشود و بلافاصله var d; خط آخر اجرا نمیشود چون js همزمان عمل نمیکند و چیزی اجرا میشود که داخل execution context بالای استک باشد. کد داخل a خط به خط اجرا میشود. به b(); میرسد. b یک execution context جدید بالای استک ایجاد میکند. پس کدهای داخل تابع b خط به خط اجرا میشوند. وقتی اجرای کدهای داخل b تمام شد به a برمیگردد چون بعد از تمام شدن تابع b م execution context آن pop میشود. بعد از آن execution context مربوط به a در استک است و بقیه کدهای a اجرا میشوند (یعنی خط var c;). بعد از تمام شدن a م execution context آن pop میشود و در global execution context خط بعدی که هنوز اجرا نشده اجرا میشود.حتی اگر تابعی خودش خودش را invoce کند execution context ایجاد میشود و بالای استک قرار میگیرد.15 - جاوااسکریپت: Functions, Context, Variable Environmentsتعریف variable environment: جایی که متغیرها زندگی میکند (ایجاد شده است) و چگونه به هم ارتباط دارند.مثلا میخواهیم بدانیم مقدار myVar در هر لحظه از اجرای کد زیر چند است:function b(){ var myVar; }function a(){ var myVar=2; b(); }var myVar = 1;a();ابتدا global execution context ایجاد میشود و مقدار myVar=1 در آن قرار داده میشود. variable environment در global execution context همان global object یا window در بروزر است.در خط بعد که تابع a فراخوانی میشود، یک execution context جدید برای a ایجاد میشود و myVar در آن execution context variable environment ذخیره میشود. هر execution context م variable environment خودش را دارد. وقتی خط اول کد تابع a اجرا میشود myVar=2 ذخیره میشود.وقتی تابع b در تابع a فراخوانی میشود یک execution context با variable environment خودش ایجاد میشود که حافظه خودش را برای متغیرها و تابع هایش دارد. در این قسمت myVar=undefined ذخیره میشود.تعریف scope: جایی که میتوانیم به متغیری دسترسی داشته باشیم.بنابراین با اینکه متغیر myVar سه بار تعریف شده، آنها unique هستند و با هم ارتباطی ندارند.اگر به آخر کدها console.log(myVar) را اضافه کنیم، به ما خروجی 1 را میدهد.