نحوه کار جاوا اسکریپت و  غیر همزمانی در جاوا اسکریپت

لینک کانال بنده در یوتوب، عضویت شما در این کانال باعث امتنان است.ما ممکن است سال ها با جاوا اسکریپت کد نوشته باشیم و ندانیم که جاوا اسکریپت به صورت داخلی چگونه کار می کند، اما مطالعه فرآیند داخلی اجرای جاوا اسکریپت مهم است و شما را در نوشتن اسکریپت های بهینه و کارا بسیار کمک می کند.ما در رابطه با جاوا اسکریپت این عبارت را بسیار می شنویم که جاوا اسکریپت تک نخ (Single Thread) است.تک نخ یعنی جاوا اسکریپت کد های را به صورت خطی و پشت هم اجرا می کند و در هر لحظه توانایی اجرای یک چیز را دارد و هر فعالیت باید منتظر بماند تا فعالیت قبلی اجرا شود تا بتواند خود اجرا گردد و قابلیت اجرای موازی کدها را ندارد! به عنوان مثال اگر کد زیر را در نظر بگیریم.و فرض کنید در خط اول فایل با حجم بالا را باید بخوانیم، پس کل فرآیند بلاک خواهد شد و باید منتظر بماند که این فعالیت انجام شود تا سایر عملیات بتوانند یکی پس از دیگری اجرا گردد.به این نوع اجرا، اجرای همزمان یا Synchronous می گویند.اما یک چیز عجیبی که پشت عبارت تک نخ جاوا اسکریپت می شنویم این است که جاوا اسکریپت قابلیت این را دارد که بلاک نشود و Non-Blocking باشد! عجیب نیست؟در ادامه نحوه رویایی جاوا اسکریپت با این مسئله را توضیح می دهیم. هر مرورگری (کروم، فایرفاکس ، سافاری .....) یک موتور مترجم جهت ترجمه و اجرای دستورات جاوا اسکریپت دارد به عنوان مثال در کروم این موتور V8 نام دارد و در مرورگر های دیگر نام ها دیگر دارد که تقریبا یک کار را انجام می دهند و آن هم اجرای دستورات جاوا اسکریپت و تبدیل آنها به زبان ماشین جهت اجرای آن استاجزای این موتور در شکل زیر نمایش داده شده است که در ادامه توضیح داده خواهد شد.پشته‌ی (استک) حافظه ( Memory Heap )این بخش جهت تخصیص حافظه متغییرهای برنامه ها استفاده می شودپشته‌ی (استک )اجرایی ( Call Stack )محلی است که در آن کد ها و توابع اجراء می گردد. مکانیزم اجرای توابع در این استک به صورت صورت LIFOیا Last In First Out است یعنی آن که آخر وارد شده اول اجرا می گردد به کد زیر توجه کنیدنحوه قرار گیری این کد در استک به صورت زیر است.همانطور که می بینیم تابع main در استک قرار می گیرد و به همین ترتیب توابع که بعد از ان صدا می گردد در استک قرار می گیرد و بعد از اینکه در کنسول عبارت مورد نظر در فانکش LevelTwo چاپ شد فانکشن ها از آخر به اول به ترتیب تا Main از استک خالی می گردد.این روند برای فانکشن های معمولی ادامه دارد تا اینکه فانکشن های Web Api به استک وارد شوند و وجه مشترک این فانکشن ها این است که نیاز به زمان جهت اجرا دارند.مانند settimeout یا درخواست های Ajax که بلافاصله موتور جستجو آنها را به بخش Webapi منتقل می کند (شکل زیر)بعد از اینکه به عنوان مثال در شکل فوق پنج ثانیه طی شد موتور جاوا اسکریپت فانکش Call Back آن را به صف Event وارد می کند (شکل زیر)و الان فانکش در موقعیت اجرا است و Event Loop دایم صف Event را چک می کند تا اگر استک اجرا خالی گرد آن را در آنجا قرار دهد ( شکل زیر)این پایان ماجرا است و موتور جاوا اسکریپت با استفاده از این فرآیند می تواند قابلیت غیر همزمانی (Asynchronous) را برای ما به ارمغان بیاورند و فانکشن های Web Api را می توانیم به صورت غیر همزمان اجرا کنیم و از بلاک کلی برنامه جلوگیری کنیم.ما در زندگی روزمره با این مسئله روبرو هستیم، به عنوان مثال ممکن است شما در حال کار باشید و تلفن شما زنگ بزند و دوست شما از شما تقاضایی داشته باشد شما به دوستتان می گوید اجازه بده من کارم تمام بشود و به شما زنگ می زنم و دوست شما هم منتظر شما نمی ماند و کارهایش را ادامه می دهد تا این که شما کارتان تمام بشود و به ایشان زنگ بزنید و یا بقول انگلیسی ها به طرف Call Back می نمایید.