"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف تعمل جافا سكريبت في الخلفية: فهم طبيعتها ذات الخيوط الواحدة والعمليات غير المتزامنة

كيف تعمل جافا سكريبت في الخلفية: فهم طبيعتها ذات الخيوط الواحدة والعمليات غير المتزامنة

تم النشر بتاريخ 2024-12-22
تصفح:919

How JavaScript Works in the Background: Understanding Its Single-Threaded Nature and Asynchronous Operations

تعد JavaScript العمود الفقري للويب، حيث تعمل على تشغيل الوظائف الديناميكية من جانب العميل لمليارات من مواقع الويب والتطبيقات. ولكن هل تساءلت يومًا كيف تعمل JavaScript بسحرها في الخلفية؟ في هذا المقال، سوف نتعمق في الأعمال الداخلية لطبيعة JavaScript أحادية الخيط ونستكشف مفهوم البرمجة غير المتزامنة.

ماذا يعني الخيوط المفردة؟

عندما نقول أن JavaScript "ذات ترابط واحد"، فهذا يعني أنها تحتوي على مكدس استدعاءات واحد. مكدس الاستدعاءات هو في الأساس البنية التي يتتبع فيها JavaScript الوظائف التي يتم تنفيذها. إنه يتبع ترتيب آخر ما يدخل، يخرج أولاً (LIFO)، مما يعني أن الوظيفة الأخيرة التي تم دفعها إلى المكدس ستكون أول وظيفة تنتهي. فيما يلي مثال لكيفية عمل ذلك:

function first() {
    console.log('First function');
}

function second() {
    console.log('Second function');
}

first();
second();

في هذا المثال، تتم إضافة الوظيفة الأولى () إلى المكدس وتنفيذها. بمجرد اكتمالها، يتم إخراجها، ويتم دفع الوظيفة الثانية () إلى المكدس وتنفيذها بعد ذلك.

على الرغم من أن اللغات ذات الترابط الواحد قد تبدو محدودة لأنها لا تستطيع سوى القيام بشيء واحد في كل مرة، إلا أن الاستخدام الذكي لجافا سكريبت للآليات غير المتزامنة يسمح لها بمحاكاة المهام المتعددة.

حلقة الحدث والتنفيذ غير المتزامن

تستخدم JavaScript التنفيذ غير المتزامن للتعامل مع العمليات التي قد تستغرق وقتًا طويلاً لإكمالها، مثل طلبات الشبكة، أو إدخال/إخراج الملفات، أو الموقتات. على الرغم من كونه أحادي الترابط، إلا أنه يمكنه إدارة مهام متعددة بشكل متزامن بفضل حلقة الأحداث وقائمة انتظار رد الاتصال.

حلقة الحدث

تعد حلقة الحدث مفهومًا أساسيًا في نموذج التزامن في JavaScript. وتتمثل مسؤوليتها الأساسية في إدارة كيفية تعامل JavaScript مع تنفيذ التعليمات البرمجية غير المتزامنة. وإليك كيفية العمل:

  1. يتم تشغيل التعليمات البرمجية المتزامنة أولاً. عندما تبدأ JavaScript، فإنها تنفذ جميع التعليمات البرمجية الموجودة في النطاق العام بطريقة متزامنة، سطرًا تلو الآخر، باستخدام مكدس الاستدعاءات.

  2. يتم إرسال المهام غير المتزامنة إلى واجهات برمجة تطبيقات الويب (مثل setTimeout، والجلب، وما إلى ذلك) أو واجهات برمجة تطبيقات Node.js، حيث ستتم معالجتها في الخلفية.

  3. قائمة انتظار رد الاتصال هي المكان الذي يتم فيه وضع العمليات غير المتزامنة بمجرد اكتمالها.

  4. تتحقق حلقة الحدث بشكل مستمر مما إذا كان مكدس الاستدعاءات فارغًا. إذا كانت المكدسة فارغة، فإنها تأخذ العنصر الأول من قائمة انتظار رد الاتصال وتدفعه إلى مكدس الاستدعاءات، مما يسمح بتنفيذه.

يكمن سحر JavaScript غير المتزامن في هذا التفاعل بين حلقة الحدث ومكدس الاستدعاءات وقائمة انتظار رد الاتصال. لا تمنع العمليات غير المتزامنة مكدس الاستدعاءات، مما يعني أن JavaScript يمكنها الاستمرار في تنفيذ تعليمات برمجية أخرى أثناء انتظار اكتمال مهام الخلفية.

مثال: استخدام setTimeout

خذ بعين الاعتبار المثال التالي مع دالة setTimeout:

console.log('Start');

setTimeout(() => {
    console.log('This runs after 2 seconds');
}, 2000);

console.log('End');

إليك ما يحدث خطوة بخطوة:

  1. تقوم JavaScript بطباعة "ابدأ".

  2. يتم استدعاء وظيفة setTimeout، ولكن بدلاً من حظر التنفيذ لمدة ثانيتين، يتم إرسالها إلى Web API، حيث تعمل في الخلفية.

  3. تقوم JavaScript بطباعة "End"، وتواصل تنفيذها دون انتظار اكتمال setTimeout.

  4. بعد ثانيتين، يتم وضع وظيفة رد الاتصال داخل setTimeout في قائمة انتظار رد الاتصال.

  5. تتحقق حلقة الحدث مما إذا كانت مكدس الاستدعاءات فارغة (وهي كذلك)، ثم تدفع وظيفة رد الاتصال إلى المكدس وتنفذها، وتطبع "هذا يعمل بعد ثانيتين".

الوعود وعدم المزامنة/الانتظار

هناك طريقة شائعة أخرى للتعامل مع المهام غير المتزامنة في جافا سكريبت الحديثة وهي من خلال الوعود وبناء الجملة غير المتزامن/الانتظار، مما يساعد على جعل التعليمات البرمجية أكثر قابلية للقراءة عن طريق تجنب عمليات الاسترجاعات المتداخلة بعمق (المعروفة أيضًا باسم "جحيم رد الاتصال").

يمثل الوعد الإكمال (أو الفشل) النهائي لعملية غير متزامنة وقيمتها الناتجة. إليك مثال:

const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('Promise resolved!');
    }, 1000);
});

promise.then(result => {
    console.log(result);  // Output after 1 second: 'Promise resolved!'
});

بدلاً من الاعتماد على عمليات الاسترجاعات، يمكننا استخدامthen() للتعامل مع ما يحدث عند حل الوعد. إذا أردنا التعامل مع التعليمات البرمجية غير المتزامنة بطريقة أكثر تزامنًا، فيمكننا استخدام async/await:

async function asyncExample() {
    const result = await promise;
    console.log(result);  // Output after 1 second: 'Promise resolved!'
}

asyncExample();

وهذا يجعل التعليمات البرمجية أكثر وضوحًا وأسهل للفهم، مما يسمح لنا "بالانتظار" حتى تكتمل المهام غير المتزامنة قبل الانتقال إلى السطر التالي من التعليمات البرمجية، على الرغم من أن JavaScript تظل غير محظورة تحت الغطاء.

المكونات الرئيسية في نموذج جافا سكريبت غير المتزامن

  1. Call Stack: حيث يتم تنفيذ التعليمات البرمجية المتزامنة.

  2. واجهات برمجة تطبيقات الويب/واجهات برمجة تطبيقات Node.js: بيئات خارجية حيث يتم التعامل مع المهام غير المتزامنة (مثل طلبات الشبكة).

  3. قائمة انتظار رد الاتصال: قائمة انتظار حيث تنتظر نتائج المهام غير المتزامنة أن يتم دفعها إلى مكدس الاستدعاءات للتنفيذ.

  4. حلقة الأحداث: النظام الذي ينسق بين مكدس الاستدعاءات وقائمة انتظار رد الاتصال، مما يضمن معالجة المهام بالترتيب الصحيح.

خاتمة

قد تبدو طبيعة جافا سكريبت ذات الترابط الواحد مقيدة للوهلة الأولى، لكن قدراتها غير المتزامنة تسمح لها بإدارة مهام متعددة بكفاءة. من خلال آليات مثل حلقة الأحداث، وقوائم انتظار رد الاتصال، والوعود، تكون JavaScript قادرة على التعامل مع العمليات المعقدة وغير المحظورة مع الحفاظ على نمط ترميز بديهي ومتزامن المظهر.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/saiarlen/how-javascript-works-in-the-background-understanding-its-single-threaded-nature-and-asynchronous-operations-5be4?1إذا كان هناك أي التعدي، يرجى الاتصال بنا اتصل على [email protected] للحذف
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3