كيف أبدأ بسرعة مع VUE3.0:
كنت في حيرة من أمري عندما بدأت دراسة سؤال اختبار كتابي منذ بعض الوقت. اليوم سنقوم بتحليل شامل لآلية تنفيذ الحدث لـ JS.
. أيها الأصدقاء، يمكنك محاولة كتابة أمر الطباعة.
يتم استخدام JSJS
أساسي كلغة برمجة نصية للمتصفح. والغرض الرئيسي من Js
هو تشغيل DOM، والذي يحدد أن JS
يجب أن تكون ذات ترابط واحد إذا كانت JS
متعددة الخيوط مثل Java، وإذا كان هناك خيطان يعملان DOM في نفس الوقت، فيجب على المتصفح كيفية تنفيذه؟
يهدف إصدار JS
في الواقع إلى الاستفادة من شعبية لغة Java التي تمت كتابتها منذ وقت ليس ببعيد، ولهذا السبب تعتبر
نظرًا لأن JS ذات ترابط واحد، يجب فرز المهام. سيتم تنفيذ جميع المهام وفقًا للقاعدة.
المهام المتزامنة
المهام غير المتزامنة
تدخل المهام المتزامنة والمهام غير المتزامنة إلى مكدس التنفيذ. ستحدد JS أولاً أن نوع المهمة
هو مهمة متزامنة. إذا دخلت إلى الخيط الرئيسي مباشرةً،
فهي مهمة غير متزامنة. أدخل Event Table
وقم بتسجيل Event Queue
لوظيفة رد الاتصال
بعد تنفيذ جميع المهام المتزامنة، ستدخل JS إلى Event Queue
، وتقوم وظيفة القراءة
بتنفيذ
هذه العملية بشكل متكرر حتى يتم الانتهاء من جميع المهام. هذه هي الطريقة التي نقول بها غالبًا أن事件循环
، لا أعرف. . . . يجب أن يكون لدى JS منطق فريد خاص به لتحديد ما إذا كانت حزمة التنفيذ فارغة أم لا.
تسلسل تنفيذ المهام غير المتزامنة هو: مهام الماكرو -> المهام الصغيرة
يمكن تقسيم المهام غير المتزامنة إلى
مهام ماكرو
المهام الصغيرة
I/0
setTimeout
setInterval
Promise
.then
.catch
vite مكون إضافي تم تكوينه من قبل، هناك بعض المشاكل في الإصدار، يرجى تجاهل هذا الإنذار الأحمر.
يبدأ开始了
متزامنة. يتم إدخاله أولاً في مكدس التنفيذ
لتنفيذ a
task()
. إدخال مكدس التنفيذ
غير متزامن / متزامن هو السطر الأول من التعليمات البرمجية سيتم تنفيذه بشكل متزامن. ما يلي سيكون الرمز غير متزامن. يدخل b
إلى مكدس التنفيذ كمهمة متزامنة،
وتصبح a end
هي المهمة الدقيقة للمهمة غير المتزامنة، وتدخل مكدس التنفيذ
حتى الآن، وقد开始了
قائمة انتظار المهام المتزامنة، a
، b
حتى الآن
، بدأت قائمة انتظار المهام غير المتزامنة المهام: setTimeout
Microtask: a end
وهنا يأتي السؤال، ألا يعني ذلك أن المهام الكلية سيتم تنفيذها قبل المهام الصغيرة؟ لماذا تتم طباعة setTimeout
بعد a end
؟
看这张图
يقوم setTimeout بإدخال قائمة انتظار المهام كمهمة ماكرو. لذا فإن السبب وراء ذلك
بشكل عام هو أن
الانتظار غير المتزامن يؤدي إلى إنشاء مهام صغيرة، لكن هذه المهمة الصغيرة تنتمي إلى مهمة الماكرو الحالية. لذلك، سيتم تنفيذ a end
أولاً، وبعد التنفيذ، سيتم الحكم على أن مهمة الماكرو الحالية قد انتهت. قم بتنفيذ مهمة الماكرو التالية، واطبع setTimeout
c
نظرًا لتحويل Promise، تصبح مهمة متزامنة وتدخل قائمة انتظار المهام
c end
تدخل قائمة انتظار المهام كمهمة صغيرة مشتقة من
d
قائمة انتظار المهام كمهمة متزامنة
a
b
c
d
هي نهاية microtask
c وmicrotask
setTimeout،
لذا فإن ترتيب الطباعة كما يلي.
قد يكون فهمي لآلية تنفيذ JS غير صحيح إلى حد ما، وآمل أن تتمكنوا من الإشارة إلى ذلك يا رفاق.
[دروس الفيديو ذات الصلة الموصى بها: الواجهة الأمامية للويب]
ما سبق هو تحليل متعمق لتفاصيل آلية تنفيذ الحدث في JS. لمزيد من المعلومات، يرجى الانتباه إلى المقالات الأخرى ذات الصلة على موقع PHP الصيني!