توضیح جامع درباره محدوده در جاوا اسکریپت (JS Scope)

js scope explanation
20 آبان 1403

در دنیای برنامه‌نویسی جاوا اسکریپت، مفهوم "محدوده" یا 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 نیز با خطا مواجه خواهد شد زیرا خارج از محدوده آن بلوک نیست.

سوالات متداول

؟

محدوده در جاوا اسکریپت چیست؟

؟

چرا از محدوده بلوک استفاده کنیم؟

؟

تفاوت var و let در جاوا اسکریپت چیست؟

؟

آیا می‌توانیم به متغیر محلی خارج از تابع دسترسی پیدا کنیم؟