یکی از جنبه های اساسی زبانهای برنامهنویسی، نحوه تعریف و مدیریت متغیرها است. در جاوا اسکریپت، از سه کلمه کلیدی let, var و const برای تعریف متغیرها استفاده میشود که هر کدام دارای ویژگی ها و رفتارهای متمایز هستند. درک تفاوت بین این کلمات کلیدی برای نوشتن کد کارآمد و بدون اشکال ضروری است. برای درک بهتر این تفاوتها، ابتدا به بررسی سه مفهوم مهم scope, hoisting, temporal dead zone(TDZ) میپردازیم.
مفهوم scope
قسمتی از برنامه که به متغیر دسترسی داریم و میتونیم از آن استفاده کنیم. در جاوااسکریپت سه نوع دامنه دسترسی داریم.
دامنه سراسری (Global Scope)، در هر جایی از کد قابل دسترسی است.
دامنه تابع (Function Scope)، تنها در محدودهی تابعی که متغیر درون آن تعریف شده است قابل دسترسی است.
دامنه بلوک (Block Scope)، تنها در داخل بلاک قابل دسترسی است که محدوده آن با { } مشخص میگردد.
مفهوم Hoisting
رفتاری در جاوااسکریپت است که متغیرها و تابعهای تعریف شده (function declaration) را در فاز ایجاد برنامه اجرایی، به بالای دامنه خود میآورد.
مفهوم temporal dead zone (TDZ)
رفتاری در جاوااسکریپت هست که متغیر از ابتدای دامنه دسترسی خود تا زمان تعریف آن (declaration) در وضعیت بدون مقدار اولیه نگه داشته میشود و اجازه دسترسی و استفاده از متغیر داده نمیشود و در صورت استفاده از متغیر در این ناحیه با خطای ReferenceError مواجه میگردیم.
کلمه کلیدی var
دامنه دسترسی متغیری که با var تعریف میشود function scope هست یعنی اگر درون تابع تعریف گردد محدوده دسترسی به درون آن تابع محدود میگردد و اگر خارج از تابع تعریف گردد در همه جای برنامه قابل دسترسی است.
متغیری که با var تعریف میشود به بالای دامنه دسترسی خود برده میشود (hoisting) و مقدار اولیه undefined به خود میگیرد و میتوان قبل از تعریف (declaration) به آن دسترسی داشت.
میتوان آن را تعریف کرد (declaration) و بعدا مقداردهی اولیه انجام داد.
میتوان آن را دوباره تعریف کرد (redeclaration).
میتوان به آن دوباره مقدار داد (reassignment).
اگر در خارج از تابع تعریف شود به عنوان یک ویژگی متغیر سراسری window به آن دسترسی داریم.
کلمه کلیدی let
دامنه دسترسی متغیری که با let تعریف میشه block-scope هست یعنی ابتدا و انتهای محدوده دسترسی آن با { } مشخص میگردد.
متغیری که با let تعریف میشود به بالای دامنه دسترسی خودش برده میشود (hoisting) اما چون با let تعریف شده است رفتار TDZ در جاوااسکریپت سبب میشود که متغیر مقدار اولیه نگیرد و تا زمان تعریف قابل دسترس نباشد.
میتوان آن را تعریف کرد (declaration) و بعدا مقداردهی اولیه انجام داد.
نمیتوان آن را دوباره تعریف کرد (redeclaration).
میتوان به آن دوباره مقدار داد (reassignment).
کلمه کلیدی const
ویژگیهای استفاده از const مانند let هست با دو تفاوت
در هنگام تعریف متغیر با const باید مقدار آن مشخص گردد.
نمیتوان متغیری را که با const تعریف شده، دوباره مقداردهی کرد.