javascriptScopeمحدودهٔ متغیر در جاوااسکریپت
Scope در جاوااسکریپت مشخص میکند یک متغیر از کجا قابل دسترسی است. محدودهٔ بلوکی let و const و سایهانداختن نامها را با مثال تخفیف بفهمید.
مفهوم به زبان ساده
محدوده یا Scope تعیین میکند کدام بخش کد به یک نام دسترسی دارد. متغیری که با let یا const داخل یک بلوک تعریف میکنید، فقط در همان بلوک و بخشهای داخلی آن قابل استفاده است. تابع نیز محدودهٔ خودش را دارد. این مرزبندی کمک میکند دادهٔ موقت یک کار، ناخواسته در بخشهای دیگر برنامه استفاده یا تغییر داده نشود.
در مثال، discount بیرونی برابر صفر است. بلوک شرط، discount دیگری با مقدار ۱۰ تعریف میکند. این متغیر جدید درون بلوک، نام بیرونی را میپوشاند؛ به این رفتار سایهانداختن میگویند. خروجی داخل بلوک ۱۰ است، اما پس از خروج از آن، discount بیرونی هنوز صفر است. هر دو نام یکساناند، ولی به دو تعریف در دو محدودهٔ متفاوت مربوط میشوند.
برای تغییر همان متغیر بیرونی، داخل بلوک دوباره let ننویسید و به نام موجود انتساب دهید؛ البته ابتدا بررسی کنید آیا این تغییر واقعاً لازم است. هرچه محدودهٔ داده کوچکتر و مسئولیت تابع روشنتر باشد، دنبالکردن تغییرها آسانتر است. var محدودهٔ بلوکی let را ندارد؛ در تمرینهای تازه از const و در صورت نیاز به انتساب دوباره از let استفاده کنید. پیش از تغییر نمونه، خروجی هر console.log را حدس بزنید و بعد تفاوت تعریف جدید و انتساب را آزمایش کنید.
کجا به کار میآید؟
- محدودکردن دادهٔ موقت یک محاسبه به همان بلوک یا تابع
- یافتن علت تغییرنکردن یا در دسترس نبودن یک متغیر
از تعریف تا یک مثال واقعی
let discount = 0;
if (true) {
let discount = 10;
console.log(discount);
}
console.log(discount);
function calculateDelivery() {
const delivery = 25000;
return delivery;
}
console.log(calculateDelivery());
10 0 25000
این مثال چطور کار میکند؟
discount بیرونی با صفر مقداردهی میشود.
let داخل شرط، تعریف تازهای با همان نام میسازد؛ متغیر بیرونی تغییر نمیکند.
پس از پایان بلوک، نام discount دوباره به تعریف بیرونی اشاره دارد.
delivery فقط در تابع تعریف شده؛ مقدار آن با return به بیرون تحویل داده میشود.
اشتباه رایج
اگر هدف تغییر متغیر موجود است، تعریف دوبارهٔ آن با let در یک بلوک داخلی این کار را انجام نمیدهد. همچنین متغیر محلی را پیش از خط تعریفش نخوانید؛ در محدودهٔ let و const با خطا روبهرو میشوید.
این را به خاطر بسپارید
نام متغیر بهتنهایی کافی نیست؛ محل تعریف آن تعیین میکند کجا در دسترس است و کدام مقدار خوانده میشود.