سه روش تعریف متغیر: var، let و const

اهداف یادگیری

  • آشنایی با سه روش تعریف متغیر در جاوااسکریپت
  • درک تفاوت Scope در var نسبت به let و const
  • فهم مفهوم Re-declaration و Re-assignment در هرکدام
  • دانستن اینکه در کدنویسی مدرن کدام روش باید اولویت داشته باشد

مقدمه

متغیر (Variable) فضایی است برای نگهداری یک مقدار که بعداً می‌توان به آن دسترسی داشت یا آن را تغییر داد. جاوااسکریپت سه کلیدواژه برای تعریف متغیر دارد: var، let و const. این سه کلیدواژه از نظر رفتار، تفاوت‌های مهمی دارند که ندانستن آن‌ها می‌تواند منجر به باگ‌های پنهان در کد شود.

var — روش قدیمی

var قدیمی‌ترین روش تعریف متغیر در جاوااسکریپت است:

var name = "علی";
console.log(name); // علی

دو ویژگی مهم var که باعث شده امروزه توصیه نشود:

  • Scope تابعی (Function Scope): متغیر var فقط داخل تابع محدود می‌شود، نه داخل بلاک‌هایی مثل if یا for.
  • قابلیت Re-declaration: می‌توان یک متغیر var را چند بار با همان نام دوباره تعریف کرد بدون آنکه خطایی رخ دهد.
if (true) {
  var message = "سلام";
}
console.log(message); // سلام — قابل دسترسی خارج از بلاک if

let — روش استاندارد مدرن

let در نسخه ES6 معرفی شد تا مشکلات var را برطرف کند:

let age = 25;
age = 26; // مقداردهی مجدد مجاز است
console.log(age); // 26

تفاوت‌های کلیدی let نسبت به var:

  • Scope بلاکی (Block Scope): متغیر let فقط داخل همان بلاکی که تعریف شده (مثلاً داخل {}) در دسترس است.
  • عدم امکان Re-declaration در همان Scope.
if (true) {
  let message = "سلام";
  console.log(message); // سلام
}
console.log(message); // خطا: message تعریف نشده است

const — مقدار ثابت

const مانند let دارای Block Scope است، اما یک تفاوت اساسی دارد: پس از مقداردهی اولیه، نمی‌توان مقدار آن را دوباره تغییر داد.

const pi = 3.14;
pi = 3.14159; // خطا: Assignment to constant variable

نکته‌ی مهم: const فقط از تغییر ارجاع (Reference) متغیر جلوگیری می‌کند، نه از تغییر محتوای داخلی یک شیء یا آرایه:

const user = { name: "سارا" };
user.name = "مریم"; // مجاز است، چون شیء تغییر می‌کند نه ارجاع آن
console.log(user.name); // مریم

user = { name: "نگار" }; // خطا: تغییر خود ارجاع مجاز نیست

تحلیل کد

در مثال بالا، user همیشه به همان شیء اشاره می‌کند؛ آنچه ممنوع است، جایگزین کردن این شیء با شیء دیگر است، نه تغییر Propertyهای داخل آن. این رفتار دقیقاً ریشه در تفاوت بین انواع Primitive و انواع Reference دارد که در درس بعدی به آن می‌پردازیم.

جدول مقایسه

ویژگیvarletconst
Scopeتابعیبلاکیبلاکی
Re-declarationمجازغیرمجازغیرمجاز
Re-assignmentمجازمجازغیرمجاز

اشتباهات رایج

  • استفاده از var در پروژه‌های جدید که می‌تواند به دلیل Function Scope باعث رفتارهای غیرمنتظره در حلقه‌ها و شرط‌ها شود.
  • تصور اینکه const یعنی مقدار کاملاً غیرقابل تغییر است؛ درحالی‌که فقط ارجاع ثابت می‌ماند، نه محتوای داخلی شیء یا آرایه.

Best Practices

  • به‌طور پیش‌فرض از const استفاده کنید.
  • اگر مقدار متغیر قرار است در آینده تغییر کند، از let استفاده کنید.
  • از var در کد جدید خودداری کنید؛ این کلیدواژه بیشتر برای سازگاری با کدهای قدیمی باقی مانده است.

جمع‌بندی

هر سه کلیدواژه var، let و const برای تعریف متغیر استفاده می‌شوند، اما از نظر Scope و قابلیت تغییر رفتار متفاوتی دارند. در کدنویسی مدرن، const پیش‌فرض است و let برای مواردی که مقدار باید تغییر کند به کار می‌رود؛ var عملاً کنار گذاشته شده است.