در جاوااسکریپت سه روش برای تعریف متغیر وجود دارد: var، let و const. در این مطلب می‌خواهیم فرق این سه را بررسی کنیم و بدانیم در چه شرایطی باید از هرکدام استفاده کنیم.

1. Scope یا دامنه متغیر

  • var تابع‌محور است (function scoped)
  • let و const بلوک‌محور هستند (block scoped)
function test() {
  if (true) {
    var a = 1;
    let b = 2;
    const c = 3;
  }
  console.log(a); // 1
  console.log(b); // ReferenceError
  console.log(c); // ReferenceError
}

2. Hoisting یا بالا بردن

هر سه متغیر hoist می‌شوند، اما:

  • var به صورت undefined بالا می‌آید.
  • let و const در اصطلاح در "منطقه مرده زمانی" (TDZ) قرار دارند تا زمانی که به آن‌ها مقداردهی شود.
console.log(x); // undefined
var x = 10;

console.log(y); // ReferenceError
let y = 20;

3. بازتعریف متغیر

  • var اجازه بازتعریف در یک scope را می‌دهد.
  • let و const این اجازه را نمی‌دهند.
var a = 5;
var a = 10; // مجاز

let b = 5;
let b = 10; // SyntaxError

const c = 5;
const c = 10; // SyntaxError

4. تغییر مقدار

  • var و let قابل تغییر هستند.
  • const فقط یک‌بار مقداردهی می‌شود و قابل تغییر نیست.
let a = 1;
a = 2; // مجاز

const b = 3;
b = 4; // TypeError

5. متغیرهای global و window

اگر با var در سطح global تعریف کنیم، به window متصل می‌شود ولی let و const این‌طور نیستند.

var a = 1;
let b = 2;

console.log(window.a); // 1
console.log(window.b); // undefined

نتیجه‌گیری

ویژگی var let const
دامنه تابع بلوک بلوک
hoisting بله، با مقدار undefined بله، اما قابل دسترسی نیست بله، اما قابل دسترسی نیست
بازتعریف مجاز غیرمجاز غیرمجاز
تغییر مقدار بله بله خیر
اتصال به window بله خیر خیر
برای کدهای مدرن، توصیه می‌شود همیشه از `let` و `const` استفاده کنید و `var` را فراموش کنید. معمولاً اگر متغیر نیاز به تغییر ندارد، از `const` استفاده کنید و در غیر این‌صورت از `let`.