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 دارد ندارد ندارد
    توسعه دهندگان
    احسان اسلامی