مفهوم Lexical Scope در جاوااسکریپت
به زبان ساده، اسکوپ به محدودهای گفته میشود که در آن یک متغیر قابل دسترسی است. در جاوااسکریپت، دو نوع اصلی اسکوپ داریم:
اسکوپ تابعی (Function Scope): متغیرها فقط داخل تابعی که تعریف شدهاند در دسترس هستند.
اسکوپ بلوکی (Block Scope): متغیرها فقط داخل بلوکی که تعریف شدهاند در دسترس هستند (این نوع اسکوپ با let و const معرفی شد).
اسکوپ لکسیکال یا اسکوپ ایستا به این معنی است که محدوده دسترسی به متغیرها بر اساس ساختار کد (زمان تعریف کد) تعیین میشود، نه بر اساس زمان اجرای کد. در واقع، جاوااسکریپت هنگام تعریف توابع، مشخص میکند که هر متغیر از کدام محدوده قابل دسترسی است.
به بیان دیگر، اسکوپ لکسیکال به کدی که مینویسید نگاه میکند و مشخص میکند که یک متغیر در چه محدودهای تعریف شده است.
function outer() { let outerVar = "من متعلق به outer هستم"; function inner() { console.log(outerVar); } inner();}outer();
در اینجا، تابع inner میتواند به متغیر outerVar که در تابع outer تعریف شده دسترسی داشته باشد. این به دلیل اسکوپ لکسیکال است. تابع inner در محدودهای تعریف شده که به outerVar دسترسی دارد. در زبانهایی که از اسکوپ دینامیک (Dynamic Scope) استفاده میکنند، دسترسی به متغیرها بر اساس محل اجرای کد تعیین میشود، نه محل تعریف آن. اما جاوااسکریپت از اسکوپ لکسیکال استفاده میکند، به این معنی که هنگام نوشتن کد (و نه اجرای آن)، محدوده دسترسی مشخص میشود.
let name = "Global";function printName() { console.log(name);}function changeName() { let name = "Local"; printName();}changeName();
در این مثال، خروجی Global خواهد بود. چرا؟ چون تابع printName بر اساس محل تعریف خود (نه محل فراخوانی)، به متغیر name دسترسی دارد. این رفتار ناشی از اسکوپ لکسیکال است.