بازگشت به درس

آیا متغیر قابل رویت است؟

اهمیت: 4

نتیجه این کد چه خواهد بود؟

let x = 1;

function func() {
  console.log(x); // ?

  let x = 2;
}

func();

پی‌نوشت: یک تله در این تکلیف وجود دارد. راه حل بدیهی نیست.

نتیجه: ارور.

سعی کنید آن را اجرا کنید:

let x = 1;

function func() {
  console.log(x); // ReferenceError: Cannot access 'x' before initialization
  let x = 2;
}

func();

در این مثال ما می‌توانیم تفاوت خاص بین یک متغیر «ناموجود» و «بدون مقداردهی اولیه» را بفهمیم.

همانطور که در مقاله محدوده متغیر، کلوژِر خواندید، زمانی که یک بلوک کد (یا یک تابع) شروع به اجرا شدن می‌کند، یک متغیر در حالت «بدون مقداردهی اولیه» قرار می‌گیرد. و تا زمانی که به دستور let برسد بدون مقداردهی اولیه می‌ماند.

به عبارتی دیگر، یک متغیر به صورت فنی موجود است اما نمی‌تواند قبل از let استفاده شود.

کد بالا این را نشان می‌دهد.

function func() {
  // از ابتدای اجرای تابع برای موتور شناخته‌شده است x متغیر محلی
  // برسد، «بدون مقداردهی اولیه» (غیر قابل استفاده) است («منطقه مرگ») let اما تا به
  // از این رو با ارور مواجه می‌شویم

  console.log(x); // ReferenceError: Cannot access 'x' before initialization

  let x = 2;
}

این منطقه که یک متغیر به طور موقتی غیر قابل استفاده است (از ابتدای بلوک کد تا let) را بعضی اوقات «منطقه مرگ» می‌گویند.