let در JS
کلمه ی کلیدی let در سال 2015 (ES6) معرفی شد.
در جاوا اسکریپت تعریف (declare) و مقداردهی (assignment) به متغیر دو عمل متفاوت است.
let name; // متغیر را تعریف کرده - declare
name = "PNLdev"; // به متغیر مقداردهی کرده - assignment
این دو عمل می تواند خلاصه نویسی شود.
let name = "PNLdev"; // متغیر را تعریف و مقداردهی کرده - declare & assignment
بازتعریف متغیر ها (Redeclare) در JS
اگر متغیری را پس از تعریف (مانند let name;) دوباره تعریف کنیم، بازتعریف گفته می شود.
متغیرهایی که با let تعریف می شوند، اجازه بازتعریف (Redeclare) در آن محدوده (scope) را ندارند.
let name = "ali"; // declare & assignment
console.log(name); // چاپ می شود
name = "ehsan"; // مقداردهی مجدد - reassignment
console.log(name); // چاپ می شود
let name = "amir"; // بازتعریف و مقداردهی مجدد
console.log(name); // ارور می دهد
نکته: چون در خط 1 متغیر را با let تعریف کرده ایم، در خط 7 اجازه بازتعریف را نداریم.
بازتعریف متغیر با var قابل انجام دادن است اما توصیه می شود این کار انجام نشود.
var name = "ali"; // declare & assignment
console.log(name); // چاپ می شود
name = "ehsan"; // بازتعریف - redeclare
console.log(name); // چاپ می شود
var name = "amir"; // بازتعریف و مقداردهی مجدد
console.log(name); // چاپ می شود
نکته: همانطور که در خط 8 می بینید، چون از var استفاده شده است. برخلاف let در نمونه کد قبلی، چاپ شده است.
محدوده بازتعریف تابع:
بازتعریف متغیری که با let، در محدوده سراسری تعریف شده است، در داخل تابع امکان پذیر است.
در واقع چون متغیر هایی که داخل تابع تعریف می شوند، دارای محدوده تابع هستند و با متغیرهای محدوده سراسری ارتباطی ندارند.
در نتیجه عمل تعریف رخ داده است نه بازتعریف.
let name = "ali"; // declare & assignment
console.log(name); // ali
function myFunction() {
let name = "ehsan";
console.log(name); // ehsan - بدون ارور، چاپ می شود
// در داخل تابع به دلیل محدوده تابع
// متغیر ها با بدنه اصلی ارتباط ندارند
// و در واقع متغیر تعریف می شود - declare
}
myFunction();
console.log(name); // ali
محدوده بازتعریف بلوکی:
بازتعریف متغیری که با let، در محدوده سراسری تعریف شده است، در داخل بلوک امکان پذیر است.
در واقع چون متغیر هایی که داخل بلوک تعریف می شوند، دارای محدوده بلوکی هستند و با متغیرهای محدوده سراسری ارتباطی ندارند.
در نتیجه عمل تعریف رخ داده است نه بازتعریف.
let name = "ali"; // declare & assignment
console.log(name); // ali
{
let name = "ehsan";
console.log(name); // ehsan - بدون ارور، چاپ می شود
// در داخل بلوک به دلیل محدوده بلوکی
// متغیر ها با بدنه اصلی ارتباط ندارند
// و در واقع متغیر تعریف می شود - declare
}
console.log(name); // ali
نکته: شما نمی توانید یک متغیر از قبل تعریف شده با let یا const را بازتعریف کنید. اما می توانید یک متغیر تعریف شده با var را بازتعریف کنید.
تفاوت بین let, var, const در JS
متغیرهایی که با let تعریف می شوند برخلاف var به صورت block scope هستند.
در ابتدا JavaScript محدوده block scope نداشت. در سال 2015 دو کلمه ی کلیدی let و const معرفی شد، که هر دو block scope هستند.
اما var یک کلمه ی کلیدی global scope است.
نکته: برای اطلاعات بیشتر راجع به block scope به محدوده ها در JS مراجعه کنید.
در جدول زیر به خوبی متوجه تفاوت بین این سه کلمه ی کلیدی خواهید شد.
کلمه کلیدی | محدوده بلوکی - block scope | بازتعریف - redeclare | مقداردهی مجدد - reassignment |
var | ندارد | دارد | دارد |
let | دارد | ندارد | دارد |
const | دارد | ندارد | ندارد |