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
با آرزوی موفقیت :))
مطلبی دیگر از این انتشارات
کلوژر کلوژر که میگن چیه؟؟؟
مطلبی دیگر از این انتشارات
بررسی event propagation در جاوااسکریپت
مطلبی دیگر از این انتشارات
آبجکت لیترالها در جاوا اسکریپت