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

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

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

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

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

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

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


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

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


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 6 سال پیش آپدیت شد
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
تخصص : Software engineer
@khanzadimahdi 6 سال پیش مطرح شد
1

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

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


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

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

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

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


aaty
@aaty2020 6 روز پیش مطرح شد
0

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


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

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