حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش جاوااسکریپت تکمیلی؛ توابع و پردازش داده

رفع باگ متغیر مشترک در closure جاوااسکریپت؛ حلقه با let

closure در جاوااسکریپت و تابع‌های دارای حافظه · 0٪

✍️ تابع‌های داخلی مقدار یک متغیر را لزوماً در لحظه ساخته شدن عکس‌برداری نمی‌کنند؛ به خود متغیر دسترسی دارند. اگر چند callback از یک شمارنده مشترک استفاده کنند و بعد از تمام شدن حلقه اجرا بشن، ممکنه همه آخرین مقدار آن شمارنده را ببینند. این همان جاییه که تفاوت var و let دوباره اهمیت پیدا می‌کنه.

مثلاً می‌خوایم برای سه برچسب، سه تابع خواندن بسازیم. اگر شمارنده حلقه var باشه، بعد از حلقه به طول آرایه رسیده و همه تابع‌ها همان اندیس خارج از محدوده را می‌خوانند. با let در تعریف حلقه، هر دور اتصال مستقل خودش را دارد و callback همان اندیس مربوط به آن دور را نگه می‌داره.

در تمرین، callbackها اول ساخته می‌شن و بعد یک‌جا اجرا می‌شن؛ ترتیب این دو مرحله را عوض نکن. خروجی باید آرایه متن‌ها باشد، نه آرایه تابع‌ها. خطای رایج، تغییر مقدار نهایی شمارنده برای اصلاح فقط آخرین عضو است؛ مسئله اصلی اشتراک متغیر میان همه callbackهاست. آرایه خالی هم باید بدون فراخوانی اضافه، خروجی خالی بده.

فعالیت شما

labelSnapshot(labels) را اصلاح کن. labels آرایه رشته است. ابتدا برای هر اندیس یک callback بساز، سپس callbackها را اجرا کن و همان برچسب‌ها را به ترتیب در آرایه نتیجه بده؛ ['الف','ب'] => ['الف','ب']، تکرار حفظ شود و خالی => []. از دامنه مستقل هر دور حلقه استفاده کن.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

function labelSnapshot(labels) {
  const readers = [];
  // TODO: برای هر اندیس با دامنه مستقل یک reader بساز.
  return readers.map(read => read());
}