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

كشف جافا سكريبت: الغوص العميق في الرفع، والمنطقة الميتة المؤقتة، والحالات المتغيرة

تم النشر بتاريخ 2024-07-30
تصفح:170

Unraveling JavaScript: A Deep Dive into Hoisting, Temporal Dead Zone, and Variable States

في الأسفل لدي سطرين من التعليمات البرمجية جميلة وبسيطة. لكن يمكنني أن أضمن لك أنه إما أنه سوف يربكك كثيرًا (لأنك تجاهلت مبدأ التسطير في JS) أو يريحك.

لكنه يحتوي على مفاهيم المعرفة المحملة بالكامل على النحو التالي

  • الرفع
  • المنطقة الميتة الزمنية
  • متغير (غير معلن، غير مهيأ، غير محدد) (مكافأة)

بياني المتناقض
كما هو الحال مع var وconst وlet يرفعون خصائصهم أيضًا، لكنهم في منطقة مختلفة.

رفع Def (إصدار بسيط / عادي)

  1. يمكننا الوصول إلى الوظائف والمتغيرات قبل الإعلان الفعلي عنها.

الآن حان الوقت للتعمق في كيفية تجميع Js وتنفيذ التعليمات البرمجية المكونة من سطرين

في JavaScript، يمكن أن تكون الطريقة التي يتعامل بها المترجم والمحرك مع الإعلانات والتخصيصات المتغيرة دقيقة، خاصة عند التعامل مع Let وvar.
دعونا نحلل العملية من منظور المترجم والتنفيذ للكود المحدد:

name = 'ashu';
let name;

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

منظور المترجم
السطر الأول: الاسم = 'أشو'؛

أثناء مرحلة التجميع،
يقوم محرك JavaScript بتوزيع التعليمات البرمجية وإنشاء النطاقات اللازمة.
اسم المهمة = 'أشو'؛

سيتم ملاحظة

، ولكن في هذه المرحلة، لا ينفذ المحرك الكود؛ فهو يسجل فقط وجود مهمة لمتغير اسمه name.

إذا لم يتم الإعلان عن الاسم من قبل، فإن المترجم يعامله على أنه إسناد لمتغير عام (اسم var في النطاق العام) حيث يتم رفع إعلانات var ويمكن الوصول إليها عالميًا.

السطر الثاني: اسمحوا الاسم؛

عندما يواجه المترجم اسم السماح؛ الإعلان، فهو يقر بأن الاسم يجب أن يكون محظورًا.

يضع المترجم الاسم في المنطقة الميتة المؤقتة (TDZ) للنطاق الذي ينتمي إليه،
بمعنى أنه يعترف بوجود الاسم ولكنه يضع علامة عليه على أنه غير مهيأ.

لا يتم رفع إعلان السماح بنفس طريقة var.

بدلاً من ذلك، يقوم بإنشاء رابط في النطاق وتهيئته فقط عند تنفيذ الإعلان.

منظور التنفيذ

السطر الأول: name = 'ashu';

عندما ينفذ محرك JavaScript اسم المهمة = 'ashu';،
يتحقق من وجود الاسم في النطاق الحالي. بما أن الاسم قد تم الإعلان عنه باستخدام Let ولكنه موجود في TDZ (المنطقة الميتة المؤقتة)، فإن أي محاولة للوصول إليه قبل تهيئة إعلان السماح ستؤدي إلى خطأ مرجعي .

وبالتالي، في هذه المرحلة، الاسم موجود في منطقة TDZ، واسم المهمة = 'ashu'؛ يؤدي إلى خطأ مرجعي.


السطر الثاني: اسمحوا الاسم؛

يقوم هذا السطر بتهيئة متغير الاسم ضمن نطاق الكتلة.
بعد هذه النقطة، لم يعد الاسم موجودًا في منطقة TDZ ويمكن الوصول إليه أو تعيينه دون أخطاء.

الآن نصيحة إضافية

الفرق بين غير معلن مقابل غير محدد مقابل غير مهيأ؛

undedeclare :- لم يتم الإعلان عن المتغير بعد.
undef :- تم الإعلان عن المتغير ولكن لم تتم تهيئته؛
غير مهيأ :- تم تعريف المتغير ولكن قيمته ستأتي لاحقًا.

مثال:- نتيجة const = multiplyBy2(5);
حتى يتم تعيين قيمة إعادة ضبط funciton للنتيجة حتى تلك النقطة ستكون في منطقة غير مهيأة.

حقيقة مثيرة للاهتمام: -

أنت تعرف المنطقة الميتة الزمنية التي تم تزيينها في البداية لـ Const ولكن تشير إلى وقت متأخر تم اعتماده في **Let**

مرجع:-

  1. https://frontendmasters.com/courses/deep-javascript-v3 تشبيهي مع مساعد GitHub
بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/ashutoshsarangi/unraveling-javascript-a-deep-dive-into-hoisting-temporal-dead-zone-and-variable-states-4d0j?1 إذا كان هناك أي انتهاك يرجى الاتصال بـ Study_golang @163.comdelete
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3