یکی دیگر از روش های تعریف متغیر استفاده از کلمه کلیدی let است. این نوع تعریف در نسخه es6 سال ۲۰۱۵ ارائه شد.
در یک محدوده، متغیری که با let تعریف میشود دیگر قابل بازنویسی نیست. اما با کلمه کلیدی var این امکان وجود دارد.
مثال:
1 2 3 |
let name = "amir"; let name = "hasan"; //error redeclare variable |
یا:
1 2 3 |
var name = "amir"; var name = "hasan"; //hasan |
امکان استفاده از متغیری که بعدا قرار است تعریف شود در حالت let وجود ندارد.
مثال:
1 2 3 |
console.log(name); let name = "amir"; //error use variable |
تعریف متغیر با کلمه کلیدی let وابسته به محدوده بلاک تعریف شده است. قبل از نسخه ۶ جاوااسکریپت تنها دارای دو محدوده عمومی و محلی برای تعریف متغیر بود اما در نسخه ۶ بلاک جدیدی برای تعریف متغیر با let و const تعریف شده است. این دو بر خلاف var به محدوده بلاک خود وفادار هستند.
متغیری که با کلمه کلیدی let درون بلاک {} تعریف میشود دیگر در خارج از بلاک قابل دسترس نیست.
مثال:
1 2 3 4 5 |
{ let x = 2; } console.log(x); //x can NOT be used here |
یا
1 2 3 4 5 |
{ var x = 2; } console.log(x); //x can be used here |
تعریف دوباره متغیر با var
تعریف دوباره متغیری که با var تعریف شده است ممکن است مشکلاتی را بوجود بیاورد و آن این است که در طول اجرای اسکریپت مقدار آن در هنگام باز تعریف شدن تغییر پیدا کند و برنامه شما به درستی کار نکند.
مثال:
1 2 3 4 5 6 7 |
var x = 10; //مقدار x در اینجا 10 است { var x = 2; //مقدار x در اینجا 2 شده است } //پس مقدار x برابر با 2 است |
راه حل
برای حل این مشکل میتوان از let استفاده کرد. در این حالت در صورت تعریف یک متغیر با let در یک بلاک و تعریف دوباره آن متغیر در بلاک های دیگر موجب تغییر در متغیرهای دیگر خود نمی شود.
مثال:
1 2 3 4 5 6 7 |
let x = 10; //مقدار x در این بلاک 10 است { let x = 2; //تعریف متغیر با نام x در یک بلاک درونی برابر با 2 است } //مقدار x در همین بلاک همچنان 10 است. |
تعریف همزمان یک نام متغیر با let و var در یک بلاک
تعریف کردن یک نام متغیر در یک بلاک یکبار با var و سپس با let یا برعکس همیشه اجازه تعریف شدن به متغیر دومی داده نمی شود و با خطا مواجه میشویم.قبلا هم گفتیم که تعریف یک نام متغیر دوبار در یک بلاک با let هم خطا ایجاد خواهد کرد.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var x = 2; //correct let x = 3; //error { let x = 2; //correct let x = 3 //error } { let x = 2; //correct var x = 3; //error } |
نکته: متغیری که با var تعریف شود دارای محدوده عمومی است اما نمی تواند متغیری که با همان نام با کلمه کلیدی let در یک بلاک دیگر تعریف شده است را تغییر دهد.
مثال:
1 2 3 4 5 6 |
var x = 2; { let x = 3; //مقدار x همچنان 3 است } //مقدار x در این بلاک 2 است |
حالت Hoisting در let
در واقع Hoisting به این معنی است که شما میتوانید متغیری را مقداردهی و استفاده کنید که قرار است بعدا تعریف شود.
این حالت در کلمه کلیدی var وجود دارد و برنامه ایرادی نمی گیرد.
مثال:
1 2 3 4 |
carName = "Volvo" console.log(carName); var carName; // Volvo |
توجه: در صورت تعریف متغیر با var و مقداردهی آن در انتهای اسکریپت مقدارش به سمت بالای اسکریپت حرکت نمی کند و مقدارش undefined است.
مثال:
1 2 3 |
console.log(carName); var carName = "Volvo" ; //undefined |
متغیری که با کلمه کلیدی let در انتهای اسکریپت تعریف میشود خود متغیر به سمت بالا حرکت می کند اما نه مقدارش بالا میرود نه می توان بالاتر مقداردهی و استفاده کرد. خطای بازگشتی ReferenceError خواهد بود.
مثال:
1 2 3 |
console.log(name); let fullName = "amir javanmir" //ReferenceError |
پشتیبانی از مرورگرها
مرورگر Chrome | مرورگر Firefox | مرورگر IE | مرورگر Edge | مرورگر Safari | مرورگر Opera |
---|---|---|---|---|---|
از ۴۹ به بعد | از ۴۴ به بعد | این ویژگی در ie 11 و قبلتر از آن پشتیبانی نمیشود. | از ۱۲ به بعد | از ۱۱ به بعد | از ۳۶ به بعد |