Scope

1️⃣ تعریف Scope (دامنه دسترسی)
Scope مشخص می‌کند کجا یک متغیر قابل دسترسی است.
در جاوااسکریپت سه نوع scope اصلی داریم: Global, Function, Block

2️⃣ Global Scope (دامنه سراسری)
متغیرهایی که خارج از هر تابع تعریف می‌شوند، در کل برنامه قابل دسترسی هستند:

let globalVar = "سلام دنیا"; function showMessage() { console.log(globalVar); // قابل دسترسی } showMessage(); console.log(globalVar); // قابل دسترسی

3️⃣ Function Scope (دامنه تابع)
متغیرهای تعریف شده داخل یک تابع فقط درون همان تابع قابل دسترسی هستند:

function myFunc() { let localVar = "سلام تابع"; console.log(localVar); } myFunc(); // "سلام تابع" console.log(localVar); // خطا → ReferenceError

4️⃣ Block Scope (دامنه بلوک)
با let و const می‌توان متغیرهای بلوکی تعریف کرد که فقط درون بلوک {} قابل دسترسی هستند:

if (true) { let blockVar = "سلام بلوک"; const anotherVar = 10; console.log(blockVar); // قابل دسترسی } console.log(blockVar); // خطا → ReferenceError console.log(anotherVar); // خطا → ReferenceError

⚠️ با var متغیرها Block Scope ندارند و فقط Function Scope دارند

5️⃣ Nested Scope (دامنه تو در تو)
توابع داخلی به متغیرهای توابع بیرونی دسترسی دارند، اما برعکس نه:

function outer() { let outerVar = "خارجی"; function inner() { console.log(outerVar); // دسترسی دارد } inner(); } outer();

6️⃣ Hoisting و Scope

  • متغیرهای var قبل از تعریف hoisted می‌شوند (بالا می‌روند)

  • let و const قبل از تعریف دسترسی ندارند (خطای ReferenceError)

console.log(a); // undefined → var hoisted var a = 5; console.log(b); // ReferenceError → let/const let b = 10;

نکات مهم

  • Scope مشخص می‌کند متغیرها کجا قابل استفاده هستند.

  • Global → کل برنامه

  • Function → داخل تابع

  • Block → داخل بلوک {} (با let/const)

  • توابع داخلی می‌توانند به متغیرهای بیرونی دسترسی داشته باشند.

  • Hoisting روی var اعمال می‌شود، ولی let و const نه.