
سؤال ۱: تحلیل کد
console.log(nameVar); // خروجی: `"Ali"`دلیل: var دارای محدوده تابع (Function-scoped) است. حتی اگر داخل بلوک if تعریف شده باشد، در کل تابع testVariables قابل دسترسی است.
console.log(nameLet); // ReferenceErrorدلیل: let دارای محدوده بلوک (Block-scoped) است. یعنی متغیر nameLet فقط در داخل آکولادهای {} مربوط به دستور if زنده است و به محض خروج از آن بلوک، از بین میرود. وقتی سعی میکنیم خارج از بلوک به آن دسترسی پیدا کنیم، خطای ReferenceError (مرجع یافت نشد) دریافت میکنیم.
console.log(nameConst); // ReferenceErrorدلیل: دقیقاً مانند let، متغیرهای const نیز Block-scoped هستند. بنابراین خارج از بلوک if در دسترس نیستند.
نکته کلیدی: این مثال به وضوح نشان میدهد که چرا استفاده از let و const منجر به کدهای قابل پیشبینیتر و تمیزتری میشود، زیرا دامنه دسترسی به متغیرها را به کوچکترین بلوک ممکن محدود میکنند.
سؤال ۲: انتخاب بهترین گزینه
-
الف) شمارنده یک حلقه (Loop Counter): **پاسخ :
let- دلیل: مقدار شمارنده در هر بار تکرار حلقه تغییر میکند (مثلاً
i++). بنابراین باید ازletاستفاده کنیم.
- دلیل: مقدار شمارنده در هر بار تکرار حلقه تغییر میکند (مثلاً
-
ب) مقدار PI (عدد ثابت ریاضی): **پاسخ :
const- دلیل: این یک مقدار ثابت و تغییرناپذیر است. استفاده از
constقصد شما را به وضوح نشان میدهد و از تغییر تصادفی آن جلوگیری میکند.
- دلیل: این یک مقدار ثابت و تغییرناپذیر است. استفاده از
-
ج) یک شیء (Object) که قرار است خصوصیات آن تغییر کند:
- تحلیل: این سؤال یک نکته بسیار مهم را آزمایش میکند. پاسخ ایدهآل و عمل یک توسعهدهنده ارشد، استفاده از
constاست. - دلیل مفهومی:
constاز تغییر ارجاع (reassignment) جلوگیری میکند، نه از تغییر محتوای شیء (Mutation).
- تحلیل: این سؤال یک نکته بسیار مهم را آزمایش میکند. پاسخ ایدهآل و عمل یک توسعهدهنده ارشد، استفاده از
const user = { name: "Ali", age: 30 };
user.age = 31; // ✅ مجاز! چون ما در حال تغییر محتوای شیء هستیم، نه خود متغیر user.
user = { name: "Reza" }; // ❌ خطا! چون در حال تغییر ارجاع متغیر user هستیم
نتیجه: از const استفاده میکنیم چون قصد نداریم متغیر user به یک شیء کاملاً جدید اشاره کند. فقط میخواهیم محتوای داخلی آن را تغییر دهیم که با const مغایرتی ندارد.
- د) یک آرایه (Array) که قرار است عناصر جدیدی به آن اضافه شود:
- تحلیل: دقیقاً مانند مورد شیء، پاسخ ایدهآل
constاست. - دلیل:
const numbers = [1, 2, 3]; numbers.push(4); // ✅ مجاز! چون در حال تغییر محتوای آرایه هستیم. numbers = [5, 6, 7]; // ❌ خطا! چون در حال تغییر ارجاع متغیر `numbers` هستیم.- نتیجه: از
constاستفاده میکنیم زیرا میخواهیم همواره به همان آرایه اصلی اشاره کند، حتی اگر محتوای آن تغییر کند.
- تحلیل: دقیقاً مانند مورد شیء، پاسخ ایدهآل
خلاصه حکم نهایی برای سؤال ۲: let, const, const, const
جمعبندی نهایی جلسه ۱:
شما مفاهیم پایهای Scope و تفاوت var با let/const را به خوبی درک کردهاید. نکتهای که باید روی آن تسلط پیدا کنید، این درک ظریف است که:
constبرای جلوگیری از “تغییر ارجاع” است، نه “تغییر محتوا”. بنابراین برای اکثر ساختارهای داده مانند Object و Array که محتوایشان تغییر میکند اما خود متغیر به ساختار جدیدی اشاره نمیکند،constانتخاب بهتری است.