رفتار hoisting متغیرهای تعریف شده درون حلقهها در جاوا اسکریپت چگونه است؟
سلام! من یک تامین کننده در تجارت بالابر هستم و امروز می خواهم به یک موضوع فوق العاده جالب در جاوا اسکریپت بپردازم: رفتار بالا بردن متغیرهای اعلام شده در داخل حلقه ها.
اول از همه، بیایید به سرعت به این موضوع بپردازیم که بالا بردن چیست. در جاوا اسکریپت، hoisting مکانیزمی است که در آن اعلانهای متغیر و تابع قبل از اجرای کد به بالای محدوده حاوی خود منتقل میشوند. مثل این است که موتور جاوا اسکریپت همه اعلانها را میگیرد و آنها را بالا میبرد. بنابراین، میتوانید از یک متغیر استفاده کنید یا یک تابع را قبل از اینکه در کد اعلام شود، فراخوانی کنید.
اکنون، وقتی نوبت به متغیرهای اعلام شده در داخل حلقه ها می رسد، همه چیز کمی پیچیده تر می شود. بیایید با مدرسه قدیمی شروع کنیمماکلمه کلیدی
بالا بردن بامادر حلقه ها
وقتی استفاده می کنیدمابرای اعلام یک متغیر در داخل یک حلقه، آن متغیر به بالای تابع محصور یا دامنه جهانی بالا می رود. راماکلمه کلیدی محدوده بلوک ندارد. فقط دارای عملکرد - سطح یا دامنه جهانی است.
به این مثال ساده نگاه کنید:
for (var i = 0; i < 3; i++) { setTimeout(function () {consol.log(i); }, 1000); }
در این کد انتظار داریم که ببینیم0،1، و2بعد از یک ثانیه چاپ شد اما آنچه در واقع اتفاق می افتد این است3سه بار چاپ می شود. چرا؟ خوب، به دلیل بالا بردن. رادر بوداعلامیه به بالای محدوده محصور شده است. تا زمانی کهsetTimeoutفراخوانها اجرا میشوند، حلقه قبلاً به پایان رسیده است و مقدار آنمناست3.
تماس های تلفنی درsetTimeoutتوابع روی یک متغیر بسته می شوندمن. از آنجایی که حلقه اجرای خود را کامل کرده است، مقدارمنبه ارزش نهایی خود رسیده است3.
برای رفع این مشکل باما، می توانیم از یک عبارت تابع فوری فراخوانی شده (IIFE) استفاده کنیم. در اینجا به این صورت است:
for (var i = 0; i <3; i++) { (function (j) {setTimeout(function () {consol.log(j); }, 1000); })(i); }
در این کد برای هر تکرار حلقه با استفاده از IIFE یک محدوده جدید ایجاد می کنیم. ارزش فعلی ازمنبه عنوان استدلال تصویب می شودjبه IIFE، و هر پاسخ تماس درsetTimeoutاکنون روی یک متغیر دیگر بسته می شودj. بنابراین، ما خروجی مورد انتظار را دریافت می کنیم0،1، و2.
بالا بردن بااجازه دهیدوپایاندر حلقه ها
ES6 معرفی شداجازه دهیدوپایان، که دارای محدوده بلوک سطح هستند. وقتی استفاده می کنیداجازه دهیدیاپایانبرای اعلام یک متغیر در داخل یک حلقه، هر تکرار حلقه نمونه جداگانه خود را از متغیر دریافت می کند.
بیایید مثال قبلی را با استفاده از آن بازنویسی کنیماجازه دهید:
برای (بگذارید i = 0; i <3; i++) { setTimeout(function () {consol.log(i); }, 1000); }
این کد به درستی چاپ می شود0،1، و2بعد از یک ثانیه رااجازه دهیدکلمه کلیدی یک اتصال جدید برایمندر هر تکرار حلقه بنابراین، هر پاسخ تماس درsetTimeoutروی یک نمونه متفاوت از بسته می شودمن.
همین طور استپایان. اگر استفاده می کنیدپایاندر داخل یک حلقه، هر تکرار نیز نمونه خاص خود را دریافت می کند، اما شما نمی توانید مقدار یک را دوباره اختصاص دهید.پایانمتغیر
برای (بگذارید i = 0; i < 3; i++) { const j = i * 2; setTimeout(function () {consol.log(j); }, 1000); }
این کد چاپ خواهد شد0،2، و4پس از یک ثانیه، همانطور که انتظار می رفت.
کاربردهای عملی
درک رفتار بالا بردن متغیرها در حلقه ها برای نوشتن کد جاوا اسکریپت صحیح بسیار مهم است، به خصوص زمانی که با عملیات ناهمزمان مانندsetTimeoutیا تماس های AJAX.
به عنوان مثال، در یک سناریوی واقعی، ممکن است در حال ساختن یک برنامه وب باشید که داده ها را از یک API برای هر مورد در یک لیست واکشی می کند. باید مطمئن شوید که هر تماس ناهمزمان مقدار درستی برای موردی که با آن کار می کند دارد.
فرض کنید از یک حلقه برای تکرار فهرستی از شناسههای محصول و برقراری تماس API برای هر محصول استفاده میکنید. اگر بالا بردن متغیر را به درستی انجام ندهید، ممکن است تمام تماسهای API را با استفاده از شناسه محصول مشابه انجام دهید.
const productIds = [1, 2, 3]; برای (بگذارید i = 0; i < productIds.length; i++) { const productId = productIds[i]; fetch(`https://api.example.com/products/${productId}`) .then(response => answer.json()) .then(data => console.log(data)); }
در این کد با استفاده ازاجازه دهیداطمینان حاصل می کند که هر تماس API درست استشناسه محصول.
مربوط به بالا بردن در کسب و کار ما
به عنوان یک تامین کننده بالابر، ما با انواع مختلف تجهیزات و مکانیزم ها سر و کار داریم. دقیقاً مانند اینکه چگونه جاوا اسکریپت قوانین مختلفی برای بالا بردن متغیرها داردما،اجازه دهید، وپایان، ما قوانین و بهترین شیوه های مختلف برای بالا بردن درتولید فلزصنعت
هنگامی که صحبت از بالا بردن سازه های فلزی سنگین برایطراحی سه بعدی پیش ساخته برای ساختمان های بلند ساختمانی فولادی، باید در مورد توزیع بار، زاویه بالا بردن و پایداری سازه بسیار مراقب باشیم. هر عملیات بالا بردن مانند یک تکرار جداگانه در یک حلقه است. ما باید اطمینان حاصل کنیم که تمام پارامترها برای هر عملیات به درستی تنظیم شده اند.
به طور مشابه، برایساختمان فلزی مسکونی مرتفع از پیش مهندسی شده، فرآیند بالا بردن پیچیده است و نیاز به درک عمیقی از طراحی سازه و قابلیت های تجهیزات بالابر ما دارد.


نتیجه گیری
در نتیجه، رفتار بالا بردن متغیرهای اعلام شده در داخل حلقه ها در جاوا اسکریپت به کلمه کلیدی استفاده شده بستگی دارد.مادارای عملکرد - سطح یا دامنه جهانی است، که می تواند منجر به نتایج غیرمنتظره در هنگام استفاده در حلقه هایی با عملیات ناهمزمان شود. از سوی دیگر،اجازه دهیدوپایاندارای محدوده بلوک سطح، ایجاد یک نمونه جدید از متغیر در هر تکرار از حلقه.
اگر در کسب و کار ساخت سازه های فولادی بلندمرتبه یا هر صنعت دیگری که نیاز به بالابر دارد، درست مانند جاوا اسکریپت هستید، دریافت درست جزئیات بسیار مهم است. چه محدوده متغیر صحیح در کد یا تکنیک بالا بردن مناسب برای تجهیزات شما، اشتباهات کوچک می تواند منجر به مشکلات بزرگ شود.
اگر به خدمات یا محصولات بالابر ما علاقه مند هستید، دریغ نکنید که برای یک تماس بگیریدبرای بحث در مورد نیازهای تدارکات خود تماس بگیرید. ما اینجا هستیم تا در مورد تمام نیازهای بالا بردن شما به شما کمک کنیم، درست همانطور که سعی کرده ایم رفتار بالا بردن را در جاوا اسکریپت برای شما روشن کنیم.
مراجع
- "جاوا اسکریپت: راهنمای قطعی" اثر دیوید فلانگان
- مستندات جاوا اسکریپت شبکه توسعه دهنده موزیلا (MDN).
