backend developer | telegram : @ali256reza
تفاوت var و let و const در جاوا اسکریپت
پیش نیاز ها : (این مقاله ها رو قبل خوندن این پست مطالعه کنین)
متغیر ها رو می تونیم به چند صورت تعریف کنیم ، با استفاده از :
- var
- let
- const
- Without declaring (بدون دکلار کردن)
ساختن متغیر بدون دکلار کردن :
تنها استفاده این نوع تعریف کردن متغیر، استفاده در فانکشن هاست.
این نوع متغیر ها تنها نوعی هستند که می تونن در function scope تعریف بشن و همینطور در global scope بشه ازشون استفاده کرد.
function name(){
x = 10;
}
name();
console.log(x);
نکته : حتما باید تابع رو صدا بزنید تا متغیر تعریف بشه
اما
اگر strict mode فعال باشه حتما باید متغیر ها رو با استفاده از var , const یا letاستفاده کنید و نمی تونین به این شکل تعریف کنین
تفاوت var با let :
اگر تفاوت این دو تا رو یاد بگیرین تفاوت const با var هم یاد می گیرید.
Let و const فقط یک تفاوت دارن
متغیر هایی که با var تعریف میشن ویژگی هایی داره که let نداره :
Hoisting :
فقط و فقط این قابلیت رو var داره ،این ویژگی باعث میشه که متغیر هایی که دکلار میشن به بالا ترین خط اسکوپ خودشون برن ، به عبارتی شما می تونین یه متغیر رو تعریف کنین قبل از این که دکلارش کنین
function run() {
console.log(foo); // undefined
var foo = "Foo"
console.log(foo); // Foo
}
run();
اما حالا با let تست کنیم :
function run() {
console.log(foo); // RefrenceError
let foo = "Foo"
console.log(foo); // Foo
}
run();
Block scope :
وقتی یک متغیر رو با var داخل block scope دکلار کنیم اون متغیر به صورت گلوبال ذخیره میشه ولی اگر با let دکلار بشه ، اون متغیر توی block scope ذخیره میشه
{
var n1 = 5;
let n2 = 6;
}
console.log(n1) //5
console.log(n2) //RefrenceError
Global object :
وقتی ما میگیم یه متغیر گلوباله یعنی اون متغیر توی global execution contextذخیره شده و هر دوی متغیر های let , var توی گلوبال اسکوپ ، در global execution contextذخیره میشن
ولی Global object با global execution context فرق داره ، گلوبال آبجکت همون window یا globalThis (در commad line node)
متغیر let به عنوان یه property داخل گلوبال آبجکت ذخیره نمیشه ولی var میشه
var a = 2;
console.log(window.a) // 2
let b = 3;
console.log(window.b) //undefined
Redeclaration :
فقط var قابلیت redeclaration داره و letنداره (redeclaration به معنای مجددا دکلار کردن یه متغیره)
var foo = "foo1"
var foo = "foo2" // OK
let bar = "bar1"
let bar = "bar2" // SyntaxError
سوال : وقتی let هیچکدوم از قابلیت هایی که varداره رو نداره برای چی ازش استفاده کنیم؟
این باعث میشه که مقدار کمتری از حافظه برنامه استفاده بشه و در مواقعی باعث جلوگیری از ساخت متغیر گلوبال اضافه میشه!
خب گفتیم let و const فقط یک تفاوت دارن :
Reassignable :
متغیر هایی که با const ساخته میشن این ویژگی رو دارن که باعث میشه نتونیم مقدار اون ها رو عوض کنیم
const v = “a”;
v = “b”; // TypeError
نکته : در object ها می تونیم مقدار property ها رو عوض کنیم ولی نمی تونیم object رو دوباره assignکنیم
const obj = {type : 'string'}
obj = {type : 'number'} // TypeError
obj.type = 'number'; //OK
با آرزوی موفقیت :))
مطلبی دیگر از این انتشارات
چگونه توابع (functions) در جاوا اسکریپت کار می کنند؟؟
مطلبی دیگر از این انتشارات
بررسی event propagation در جاوااسکریپت
مطلبی دیگر از این انتشارات
کش(Cache) کردن اطلاعات در جاوااسکریپت