majid
5 سال پیش توسط majid مطرح شد
5 پاسخ

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

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

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

ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

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

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


فاطمه کاظمی زاده
تخصص : Senior front-end در هولدینگ دک...
@kazemi 5 سال پیش مطرح شد
0

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


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 5 سال پیش آپدیت شد
2

درون 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
تخصص : backend developer at Snapp mar...
@khanzadimahdi 5 سال پیش مطرح شد
1

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

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


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 5 سال پیش مطرح شد
0

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

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

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


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

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