اگرچه ممکن است نیاز به درک عمیق از زبانهایی مانند C ++ و C برای نوشتن کد تولید در مقیاس کامل ، JavaScript را اغلب می توان با یک درک اساسی از آنچه می توان با زبان انجام داد ، نوشت..


مفاهیم ، مانند ارسال مجدد تماسها به توابع یا نوشتن کد ناهمزمان ، اغلب اجرای آنچنان دشوار نیستند ، که باعث می شود بیشتر توسعه دهندگان JavaScript نسبت به آنچه در زیر هود می گذرد ، کمتر اهمیت دهند. آنها فقط به درک پیچیدگی هایی که با زبان آنها عمیقاً انتزاع شده اند اهمیتی نمی دهند.

به عنوان یک توسعه دهنده جاوا اسکریپت ، درک این مسئله که واقعاً در زیر کاپوت چه اتفاقی می افتد و چگونگی کار بسیاری از این پیچیدگی ها از ما واقعاً مهم است ، به طور فزاینده ای اهمیت پیدا می کند. این به ما کمک می کند تا تصمیمات آگاهانه تری بگیریم ، که به نوبه خود می تواند عملکرد کد ما را به طرز چشمگیری تقویت کند.

این مقاله به یکی از مفاهیم یا اصطلاحات بسیار مهم اما به ندرت درک شده در JavaScript می پردازد. LOOP رویداد!. 

از نوشتن کد ناهمزمان در جاوا اسکریپت نمی توان جلوگیری کرد ، اما چرا یک کد در حال اجرا به صورت غیر همزمان می تواند به معنای واقعی باشد؟ یعنی. حلقه رویداد

قبل از اینکه بفهمیم حلقه رویداد چگونه کار می کند ، ابتدا باید درک کنیم که خود JavaScript چیست و چگونه کار می کند!

JavaScript چیست؟?

قبل از شروع کار ، من دوست دارم که ما یک قدم به اصول اولیه برداریم. واقعاً JavaScript چیست؟ ما می توانیم JavaScript را به عنوان تعریف کنیم؛

JavaScript یک سطح بالا ، تفسیر ، تک رشته ای است که بدون انسداد ، ناهمزمان ، همزمان همزمان است.

صبر کنید ، این چیست؟ تعریف کتابی؟ ��

بیایید آن را تجزیه کنیم!

کلمات کلیدی در اینجا با توجه به این مقاله می باشد تک رشته ای, غیر مسدود ، همزمان, و نامتقارن.

موضوع واحد

موضوع اجرا کوچکترین دنباله دستورالعمل برنامه ریزی شده است که می تواند توسط یک برنامه ریز به طور مستقل مدیریت شود. یک زبان برنامه نویسی تک رشته ای است به این معنی که تنها می تواند یک کار یا عملی را در یک زمان واحد انجام دهد. این بدان معنی است که می تواند یک روند کامل را از ابتدا تا انتها انجام دهد بدون اینکه نخ یا قطع شود یا متوقف شود.

بر خلاف زبان های چند رشته ای ، که می توان چندین فرآیند را همزمان بر روی چندین موضوع انجام داد بدون اینکه یکدیگر را مسدود کنیم.

چگونه می توان جاوا اسکریپت را به صورت تک رشته ای و غیر مسدود کردن همزمان?

اما مسدود کردن به چه معنی است?

بدون انسداد

هیچ تعریفی از مسدود کردن وجود ندارد. این فقط به معنای چیزهایی است که به آرامی در حال اجرا هستند. بنابراین غیر مسدود کردن به معنای چیزهایی است که آهسته بر سر نخ نیستند.

اما صبر کنید ، گفتم جاوا اسکریپت روی یک موضوع واحد اجرا شود؟ و من نیز آن را غیر مسدود کننده گفتم ، این بدان معنی است که کار سریع روی پشته تماس اجرا می شود؟ اما چگونه؟ وقتی تایمر را اجرا می کنیم چطور؟ حلقه ها?

آروم باش! ما کمی درمی فهمیدیم.

هم زمان

همزمان بودن به این معنی است که کد توسط بیش از یک موضوع به طور همزمان اجرا می شود.

خوب ، همه چیز در حال پیشرفت است عجیب و غریب حال ، چگونه JavaScript می تواند تک رشته ای باشد و همزمان همزمان باشد؟ یعنی اجرای کد آن با بیش از یک موضوع?

نامتقارن

برنامه نویسی ناهمزمان به معنای اجرای کد در یک حلقه رویداد است. هنگامی که یک عملیات مسدود کردن وجود دارد ، این رویداد آغاز می شود. کد مسدود کردن بدون مسدود کردن موضوع اجرای اصلی ، همچنان به کار خود ادامه می دهد. هنگامی که کد مسدود کردن به پایان رسید ، نتیجه عملیات مسدود کردن صف می شود و آنها را به پشته سوق می دهد.

اما جاوا اسکریپت یک موضوع واحد دارد؟ چه اتفاقی می افتد این کد مسدود کننده را هنگام اجرای سایر کدهای موجود در موضوع انجام می دهد?

قبل از ادامه کار ، بیایید از موارد فوق بازپرداخت کنیم.

  • جاوا اسکریپت تک رشته ای است
  • جاوا اسکریپت غیر مسدود است ، یعنی فرآیندهای آهسته اجرای آن را مسدود نمی کنند
  • جاوا اسکریپت همزمان است ، یعنی کد خود را در بیش از یک موضوع به طور همزمان اجرا می کند
  • جاوا اسکریپت ناهمزمان است ، یعنی مسدود کردن کد در جایی دیگر اجرا می شود.

اما موارد فوق دقیقاً اضافه نمی شوند ، چگونه یک زبان تک رشته ای می تواند غیر مسدود کننده ، همزمان و ناهمزمان باشد?

بیایید کمی عمیق تر به پیش برویم ، بیایید به موتورهای جاوا اسکریپت V8 برویم ، شاید این موضوعات دارای موضوعات پنهانی باشد که ما از آنها آگاه نیستیم.

موتور V8

موتور V8 یک موتور زمان اجرای مونتاژ وب با منبع باز و با کارایی بالا برای JavaScript است که توسط گوگل در C ++ نوشته شده است. اکثر مرورگرها JavaScript را با استفاده از موتور V8 اجرا می کنند ، و حتی محیط زمان اجرا گره js نیز از آن استفاده می کند.

به زبان انگلیسی ساده ، V8 یک برنامه C ++ است که کد JavaScript را دریافت می کند ، آن را کامپایل و اجرا می کند.

V8 دو کار اصلی انجام می دهد؛

  • تخصیص حافظه پشته
  • با زمینه اجرای پشته تماس بگیرید

متاسفانه ، ظن ما اشتباه بود. V8 فقط یک پشته مکالمه دارد ، از پشته تماس به عنوان موضوع فکر کنید.

یک موضوع === یک تماس پشته === یک اجرای در یک زمان.

تصویر – ظهر هکر

از آنجا که V8 فقط یک پشته مکالمه دارد ، پس چگونه JavaScript بدون مسدود کردن موضوع اجرای اصلی ، به طور همزمان و ناهمزمان اجرا می شود?

بیایید سعی کنیم با نوشتن یک کد ساده اما ناهمزمان اما در عین حال مشترک آن را دریابیم و آن را با هم تجزیه و تحلیل کنیم.

جاوا اسکریپت هر خط کد را به صورت خط ، یکی پس از دیگری (تک رشته ای) اجرا می کند. همانطور که انتظار می رود ، خط اول در کنسول در اینجا چاپ می شود ، اما چرا آخرین خط قبل از کد زمان بندی چاپ می شود؟ چرا روند اجرای برنامه منتظر دریافت کد پایان (مسدود کردن) قبل از ادامه کار برای اجرای آخرین خط نیست?

به نظر می رسد برخی از موضوعات دیگر به ما کمک کرده است که آن زمان را انجام دهیم زیرا ما بسیار مطمئن هستیم که یک موضوع فقط در هر مقطع زمانی می تواند یک تک کاره را انجام دهد.

بیایید نگاه تند و زننده ای را به آن وارد کنیم کد منبع V8 در حالی که برای.

صبر کن … چی؟ !!! هیچ توابع تایمر در V8 وجود ندارد ، DOM وجود ندارد؟ هیچ رویدادی نیست؟ نه AJAX؟ … Yeeeeessss!!!

رویدادها ، DOM ، تایمر و غیره جزئی از اجرای اصلی JavaScript نیستند ، JavaScript کاملاً با مشخصات Ecma Scriptts مطابقت دارد و نسخه های مختلف آن اغلب مطابق با مشخصات اسکریپت های Ecma (ES X).

گردش کار اعدام

رویدادها ، تایمرها ، درخواست های Ajax همه توسط مرورگرها در کنار مشتری ارائه می شوند و غالباً به عنوان Web API گفته می شوند. آنها مواردی هستند که جاوا اسکریپت تک رشته ای را غیر مسدود ، همزمان و ناهمزمان می کنند! اما چگونه?

سه بخش اصلی برای گردش کار اجرای هر برنامه جاوا اسکریپت ، پشته تماس ، API وب و صف کار وجود دارد..

تماس با پشته

stack یک ساختار داده است که در آن آخرین عنصر اضافه شده همیشه اولین موردی است که از پشته جدا می شود ، می توانید از آن به عنوان پشته یک صفحه استفاده کنید که در آن فقط اولین صفحه که آخرین اضافه شده است می توانید ابتدا حذف کنید. Call Stack به سادگی چیزی جز ساختار داده های پشته نیست که وظایف یا کد را بر این اساس انجام می دهند.

بیایید مثال زیر را در نظر بگیریم.

منبع – https://youtu.be/8aGhZQkoFbQ

هنگامی که شما تابع printSquare () را فراخوانی می کنید ، بر روی پشته فراخوانی فشار داده می شود ، تابع printSquare () تابع مربع () را فراخوانی می کند. عملکرد مربع () بر روی پشته فشار داده می شود و همچنین عملکرد (multip) () را فراخوانی می کند. عملکرد ضرب بر پشته فشار می یابد. از آنجا که عملکرد چند برابر شده است و آخرین چیزی است که به پشته فشار داده شده است ، ابتدا آن را برطرف می کنید و از پشته برداشته می شوید ، به دنبال آن عملکرد مربع () و سپس تابع printSquare ().

API وب

این جایی است که کدی که توسط موتور V8 کار نمی کند اجرا می شود تا موضوع اجرای اصلی را “مسدود نکند”. هنگامی که Call Stack با یک عملکرد API وب روبرو می شود ، این روند بلافاصله به API وب داده می شود ، در آنجا اجرا می شود و Call Stack را برای انجام سایر عملیات در حین اجرای آن آزاد می کند..

بیایید به مثال تنظیمات گذشته ما در بالا برگردیم؛

وقتی کد را اجرا می کنیم ، اولین خط console.log به سمت پشته سوق می شود و تقریباً بلافاصله خروجی خود را دریافت می کنیم ، با رسیدن به زمان اتمام ، تایمرها توسط مرورگر اداره می شوند و جزئی از اجرای اصلی V8 نیستند ، فشار می یابد. در عوض به API وب ، پشته را آزاد کنید تا بتواند سایر عملیات را انجام دهد.

در حالی که زمان پایان کار هنوز است ، پشته به خط بعدی عمل می رود و آخرین console.log را اجرا می کند ، که توضیح می دهد که چرا ما آن را از قبل از تایمر تایپ می کنیم. پس از اتمام زمان سنج ، اتفاقی می افتد. کنسول.لاگ در آن زمان تایپ مجدداً در پشته تماس ظاهر می شود!

چگونه?

حلقه رویداد

قبل از اینکه درباره حلقه رویداد صحبت کنیم ، اجازه می دهیم ابتدا عملکرد صف کار را انجام دهیم.

به عنوان مثال زمان اتمام ما ، به محض اینکه API وب ، اجرای کار را تمام کرد ، فقط آن را به صورت خودکار به Call Stack بازگرداند. می رود به صف کار. 

یک صف ساختار داده ای است که در اصل First در First out کار می کند ، بنابراین وقتی وظایف به صف رانده می شوند ، به همان ترتیب خارج می شوند. کارهایی که توسط API وب اجرا شده است ، که به صف کارها رانده می شوند ، دوباره به Call Stack برگردید تا نتیجه آنها چاپ شود.

اما صبر کنید آنچه HECK LOOP رویداد است???

منبع – https://youtu.be/8aGhZQkoFbQ

حلقه رویداد روندی است که منتظر است قبل از فشار دادن تماس های برگشتی از Task Queue به Call Stack ، Call Stack روشن شود. پس از روشن شدن پشته ، حلقه رویداد باعث ایجاد و بررسی Task Queue برای تماسهای برگشتی در دسترس می شود. اگر وجود داشته باشد ، آن را به Call Stack سوق می دهد ، منتظر است تا دوباره Call Stack پاک شود و همین روند را تکرار کند.

منبع – https://www.quora.com/How-does-an-event-loop-work/answer/Timothy-Maxwell

نمودار بالا جریان کاری اصلی بین Event Loop و Task Queue را نشان می دهد.

نتیجه

در حالی که این یک مقدمه بسیار اساسی است ، مفهوم برنامه نویسی ناهمزمان در جاوا اسکریپت به بینش کافی می پردازد تا به وضوح درک کند که چه چیزی در زیر کاپوت اتفاق می افتد و چگونه JavaScript قادر است همزمان و همزمان با یک موضوع واحد اجرا شود..

جاوا اسکریپت همیشه مورد تقاضا است ، و اگر کنجکاو برای یادگیری هستید ، به شما توصیه می کنم این موضوع را بررسی کنید البته Udemy.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me