جلسه ۲ - تفاوت بین let  و const

سؤال ۱: تحلیل کد

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 انتخاب بهتری است.