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