Hoisting
در جاوااسکریپت، Hoisting به معنی بالا بردن (یا انتقال) تعریف متغیرها و توابع به بالای Scope خودشون قبل از اجرای کد است.
به عبارت ساده، جاوااسکریپت قبل از اجرای کد، تعاریف var
و توابع را پردازش میکند و به بالای Scope منتقل میکند.
🔹 Hoisting برای توابع
توابعی که با Function Declaration تعریف میشوند، کامل Hoist میشوند و میتوان قبل از تعریف آنها فراخوانی کرد:
📌 خروجی:
اما توابع Function Expression با
var
فقط نام متغیر را Hoist میکنند، نه مقدار تابع را:
🔹 Hoisting برای متغیرها
1. متغیرهای var
-
نام متغیر Hoist میشود، اما مقداردهی نه.
-
قبل از مقداردهی، مقدار آن
undefined
است.
2. متغیرهای let
و const
-
Hoist میشوند اما در "Temporal Dead Zone" (TDZ) قرار دارند.
-
قبل از مقداردهی، دسترسی به آنها خطا ایجاد میکند.
🔹 Temporal Dead Zone (TDZ)
-
محدودهای است که متغیر با
let
یاconst
Hoist شده ولی هنوز مقداردهی نشده است. -
هر دسترسی قبل از مقداردهی باعث خطا میشود.
🔹 نکات کلیدی
-
Function Declaration → کامل Hoist میشود.
-
Function Expression → فقط نام متغیر Hoist میشود.
-
var → نام متغیر Hoist میشود، مقداردهی نه.
-
let / const → Hoist میشوند ولی در TDZ هستند و قبل از مقداردهی دسترسی غیرمجاز است.
-
Hoisting فقط تعریفها را بالا میبرد، اجرا و مقداردهی در جای خودش انجام میشود.
✅ خلاصه
-
Hoisting باعث میشود بتوانیم توابع و متغیرها را قبل از تعریف فراخوانی کنیم (با محدودیتها).
-
برای کاهش خطا و کد خواناتر، بهتر است همیشه متغیرها را قبل از استفاده تعریف کنیم و از
let
/const
به جایvar
استفاده کنیم.