در دنیای برنامهنویسی جاوا اسکریپت، مفهوم "محدوده" یا Scope یکی از مفاهیم کلیدی و پایهای است که باید آن را درک کنید. اساساً، محدوده به ما میگوید که متغیرها و توابع در کجاها قابل دسترسی هستند و در کدام زمینهها میتوانند استفاده شوند.
به طور کلی، جاوا اسکریپت دارای دو نوع اصلی محدوده است: محدوده سراسری (global scope) و محدوده محلی (local scope). متغیرهایی که در خارج از هر تابعی تعریف میشوند، در محدوده سراسری قرار دارند و بنابراین در هر جای دیگر از کد جاوا اسکریپتی در دسترس هستند. در مقابل، متغیرهایی که در داخل یک تابع تعریف میشوند، در محدوده محلی آن تابع قرار دارند و فقط در داخل آن تابع قابل دسترس هستند.
از نسخه ECMAScript 6 به بعد، ما شاهد معرفی محدوده بلوک (block scope) نیز هستیم که با استفاده از کلیدواژههای `let` و `const` میتوانیم متغیرها را در محدوده یک بلوک، مثلاً بلوکهای درون یک حلقه `for` یا یک دستور `if`, تعریف کنیم.
این ویژگیها باعث میشوند تا برنامهنویسان بتوانند کدهای تمیزتر و بهینهتری بنویسند و از مشکلات رایج ناشی از دسترسیهای نامناسب به متغیرها جلوگیری کنند. در ادامه نمونهای از این مفاهیم را با کدهای عملی نشان میدهیم.
<script>
// متغیرهای محدوده سراسری
var globalVar = 'من یک متغیر سراسری هستم';
function localScopeDemo() {
// متغیرهای محدوده محلی
var localVar = 'من یک متغیر محلی هستم';
console.log(localVar); // داخل تابع قابل دسترسی است
}
localScopeDemo();
// تلاش برای دسترسی به متغیر محلی خارج از تابع
console.log(localVar); // خطا: localVar تعریف نشده است
// استفاده از محدوده بلوک
if (true) {
let blockVar = 'من یک متغیر بلوک هستم';
console.log(blockVar); // درون بلوک قابل دسترسی است
}
// تلاش برای دسترسی به متغیر بلوک خارج از بلوک
console.log(blockVar); // خطا: blockVar تعریف نشده است
</script>
توضیح خط به خط کد
var globalVar = 'من یک متغیر سراسری هستم';
در اینجا یک متغیر سراسری به نام
globalVar
تعریف کردیم که در هر جای دیگری در کد در دسترس است.function localScopeDemo() { var localVar = 'من یک متغیر محلی هستم'; }
تابعی به نام
localScopeDemo
داریم، که درون آن یک متغیر محلی localVar
تعریف شده است. این متغیر فقط در همین تابع قابل استفاده است.console.log(localVar);
درون تابع، متغیر محلی
localVar
را چاپ میکنیم؛ این کار درون تابع امکانپذیر است.console.log(localVar);
وقتی خارج از تابع تلاش میکنیم این متغیر را چاپ کنیم با خطا مواجه میشویم چون خارج از آن تابع قابل دسترس نیست.
if (true) { let blockVar = 'من یک متغیر بلوک هستم'; }
در اینجا یک متغیر بلوک
blockVar
درون یک بلوک if
تعریف کردیم که فقط درون همان بلوک قابل استفاده است.console.log(blockVar);
خارج از بلوک
if
، تلاش برای دسترسی به متغیر blockVar
نیز با خطا مواجه خواهد شد زیرا خارج از محدوده آن بلوک نیست.