راکت

یک پرسش مفهومی از جاوااسکریپت

6 پاسخ

سلام.من کد زیر رو هم در محیط نود و هم در مرورگر اجرا کردم .

console.log(1);
setTimeout(()=>console.log(2),0);
console.log(3);```
نحوه ی نمایش مقادیر به صورت زیره:
1
3
2
میخواستم بدونم دلیلش چی میتونه باشه؟
majid
majid
@michael
ثبت پرسش جدید

پاسخ‌ها

6
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

درود
این شکل از اجرای کد برمیگرده به نحوه تفسیر کدها توسط engine و مفسر جاوا اسکریپت
کد ها از بالا به پایین خونده میشن. هنگامی که به setTimeout میرسه میره به خط بعد و همه چیز که اجرا شد بر میگرده و شماره ۲ رو با وقفه ۰ صدم ثانیه پرینت میکنه

برای اطلاعات بیشتر ،‌مبحث اسکوپ‌هارو در جاوااسکریپت دنبال کنید

فاطمه کاظمی زاده
فاطمه کاظمی زاده
@kazemi

تخصص: Senior front-end در هولدینگ دکتر کرمانی - مدرس مجتمع فنی

به دلیل تاخیر زمانی که در کد انداختین هست

شاید پاسخ شما همین‌جا باشد

mahdi khanzadi
mahdi khanzadi
@khanzadimahdi

تخصص: Software engineer

درون nodejs ابتدا تمامی کدها تفسیر میشن و درون یک پشته قرار میگیرن. کدهایی که به صورت async نوشته میشن درون یک صف جداگانه به نام event loop قرار میگیرن . وقتی که کار پشته اصلی تمام بشه بعدش نوبت به اجرا شدن پشته event loop میشه.

یه حلقه وجود داره که به صورت دائم روی پشته ی اصلی اجرا میشه (به هر بار که اجرا میشه یک تیک میگن) و هر دفعه یک دستور رو از روی پشته بر میداره و اون رو اجرا میکنه. وقتی که پشته ی اصلی خالی بشه نوبت به پشته ی event loop میشه. بنابراین دستورات event base و async بعد از دستورات عادی نتیجه گیری میشن.

یه نگاه به لینک زیر بندازید خوب توضیح نداده! اما از هیچی بهتره!

https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/

mahdi khanzadi
mahdi khanzadi
@khanzadimahdi

تخصص: Software engineer

@ali.bayat @kazemi
ربطی به اسکوپ و تاخیر زمانی نداره. اگه دقت کنید تاخیرش صفر هست و کدها همه در یک سطح در اسکوپ گلوبال اجرا شدن.

برمیگرده به call stack و event loop stack که نود اول call stack رو خالی میکنه بعدش میره event loop stack رو اجرا میکنه پس دستورات ایونت بیس و async بعد از دستورات اصلی اجرا میشن.

میلاد-م
میلاد-م
@milad

تخصص: توسعه‌دهنده رابط کاربری - Front-End

کدهاتون رو به درستی قرار می دادید بهتر بودش.

دلیل کلی ش اینه که وقتی مباحث ناهمزمانی مطرح میشند، موتور جاوااسکریپت روی کدها توقف نمی کنه و میره سراغ کدهای بعدی.
در اینجا هم خط دوم کدهای شما و تابع setTimeout() باعث ایجاد این پدیده میشه.

اما در خصوص جزئیات و پشت صحنه ی نحوه عملکردش، جناب @khanzadimahdi توضیح دادند که چطور به کمک پشته ی event loop، این فرآیند صورت میگیره.

aaty
aaty
@aaty2020

سلام خواستم به دوستان عزیز سایتی رو معرفی کنم که به صورت تصویری نحوه اجرای دستورات توی js و در مرورگر رو یاد میده البته توی github گفته که به زودی event loop مربوط به node.js رو هم اضافه میکنه خیلی جالبه فقط نمیدونم 100 درصد درست کار میکنه یا نه موفق باشید.
https://vault-developer.github.io/event-loop-explorer/

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام