در جاوااسکریپت سه روش برای تعریف متغیر وجود دارد: 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 | بله | خیر | خیر |