ویرگول
ورودثبت نام
مصطفی رستگار
مصطفی رستگاربرنامه نویس کامپیوتر و ازین جور مسخره بازی ها!
مصطفی رستگار
مصطفی رستگار
خواندن ۴ دقیقه·۴ ماه پیش

04- Hoisting در var، let، const و function declarations (TDZ)

اینجا یک متن ساده، روان و کاملاً فنی برای تو آماده کردم که می‌توانی در مصاحبه دقیقاً به همین زبان بیان کنی. سعی کردم خیلی شماتیک و قابل‌درک باشد:


متن برای مصاحبه (آن را با همین لحن بخوان):

"هویستیگ (Hoisting) در جاوااسکریپت یعنی مراحل کامپایل شدن کد قبل از اجرا. در این مرحله، موتور جاوااسکریپت تمام تعاریف (Declarations) را به بالای محدوده (Scope) خودش منتقل می‌کند. اما نکته مهم اینجاست که همه نوع هویستیگ با هم یکسان نیستند و تفاوت آن‌ها در مقداردهی اولیه و TDZ است.

۱. Function Declarations (تعریف توابع با function):
این‌ها کاملترین نوع هویستیگ را دارند. یعنی هم اسم تابع و هم بدنهٔ آن به بالا می‌رود. به همین دلیل می‌توانیم قبل از تعریف تابع، آن را صدا بزنیم و خطایی نمی‌خورد.

۲. متغیرهای var:
این‌ها هویستیگ می‌شوند، اما فقط اسم آن‌ها به بالا می‌رود و مقداردهی‌اش در همان جای خودش می‌ماند. به همین دلیل اگر قبل از مقداردهی به آن دسترسی داشته باشیم، مقدار undefined را دریافت می‌کنیم و خطا نمی‌دهد.

۳. متغیرهای let و const:
این‌جا بحث اصلی TDZ یا Temporal Dead Zone پیش می‌آید. این متغیرها هم هویستیگ می‌شوند، اما موتور جاوااسکریپت آن‌ها را در یک ناحیهٔ مردهٔ زمانی قرار می‌دهد. یعنی از شروع محدوده (Scope) تا خطی که متغیر تعریف شده، دسترسی به آن ممنوع است. اگر قبل از خط تعریف، بخواهیم به let یا const دسترسی پیدا کنیم، برنامه با خطای ReferenceError متوقف می‌شود، چون در TDZ گیر کرده‌ایم."


اگر مصاحبه‌کننده بپرسد: «پس فرق TDZ در let و const چیست؟»

می‌توانی این را هم اضافه کنی:

"هر دو در TDZ قرار دارند، اما تفاوت در مقداردهی اولیه است. متغیر let را می‌توانیم بدون مقدار اولیه تعریف کنیم (مقدارش undefined می‌شود)، اما const حتماً در همان خط تعریف، باید مقداری داشته باشد، وگرنه خطای Syntax می‌دهد."


یک نکتهٔ طلایی برای مصاحبه:

اگر خواستی خیلی حرفه‌ای به نظر برسی، این جمله را آخرش بگو:

"پس درک این موضوع به ما می‌گوید که بهترین کار این است که همیشه متغیرها و توابع را در بالای محدوده خود تعریف کنیم تا از سردرگمی و خطاهای TDZ جلوگیری کنیم."

قسمت دوم: کدهای عملی برای نشان دادن در مصاحبه

"اگر اجازه بدید، با چند مثال ساده نشون می‌دم که توی عملیات چطوریه:"

۱. مثال برای function (هویستیگ کامل):

javascript

sayHello(); // خروجی: "Hello World!" function sayHello() { console.log("Hello World!"); }

"اینجا خطا نمی‌دهیم، چون کل تابع به بالا رفته."


۲. مثال برای var (هویستیگ اسم، مقدار undefined):

javascript

console.log(name); // خروجی: undefined var name = "Ali"; console.log(name); // خروجی: "Ali"

"موتور جاوااسکریپت این کد رو اینطوری می‌بینه:"

javascript

var name; // فقط اسم بالا رفته console.log(name); // undefined name = "Ali"; console.log(name); // "Ali"

۳. مثال برای let و const (خطای TDZ):

javascript

console.log(age); // ReferenceError: Cannot access 'age' before initialization let age = 30;

"با اینکه age هویستیگ شده، ولی تا خط سوم که مقداردهی بشه، توی منطقه ممنوعه (TDZ) قرار داره. این یعنی جاوااسکریپت بهمون می‌گه: 'میدونم این متغیر رو داری، ولی فعلاً اجازه دسترسی نداری!'"


۴. تفاوت let و const در مقداردهی:

javascript

let firstName; // کاملاً اشکالی نداره، مقدارش undefined میشه const lastName; // SyntaxError: Missing initializer in const declaration

قسمت سوم: سوالات تکراری مصاحبه (با پاسخ‌های آماده)

سوال: "آیا class در جاوااسکریپت هم هویستیگ داره؟"

پاسخ شما:
"بله، کلاس‌ها هم هویستیگ می‌شن، اما درست مثل let و const در TDZ قرار می‌گیرن. یعنی اگر قبل از تعریف کلاس، نمونه‌سازی (new) کنیم، خطای ReferenceError می‌خوریم. این کار عمدی طراحی شده تا برنامه‌نویسی تمیزتری داشته باشیم."


سوال: "اگر همزمان var و function همنام داشته باشیم چی میشه؟"

پاسخ شما:
"توابع اولویت بالاتری دارن و توی هویستیگ، تابع بر var غلبه می‌کنه. ولی اگر بعداً تابع رو بازنویسی کنیم، مقدار جدید جایگزین میشه. این جزو نکات سختگیرانه‌ست و دقیقاً به خاطر همین هست که استفاده از var دیگه توی کدهای مدرن توصیه نمی‌شه."


سوال: "TDZ دقیقاً از کجا شروع میشه و کجا تموم؟"

پاسخ شما:
"از ابتدای محدوده (اسکوپ) مثل بلاک { } یا خود تابع شروع میشه و تا خطی که let یا const تعریف شدن ادامه داره. به محض اینکه خط تعریف رد شد، TDZ تموم میشه و متغیر قابل دسترسه."


یک جمع‌بندی کوتاه برای پایان مصاحبه (خیلی حرفه‌ای):

"در کل، هاستینگ یه رفتار جالب در موتور جاوااسکریپته که می‌تونه مفید باشه (مثل توابع) یا باعث خطاهای عجیب بشه (مثل var). به خاطر همین، توی تیم‌های حرفه‌ای از let و const استفاده می‌کنیم و همیشه متغیرها رو اول اسکوپ تعریف می‌کنیم تا کد قابل پیش‌بینی و خوانا باشه. اینطوری دیگه سورپرایز TDZ رو نداریم!"


یه ترفند آخر (برای اینکه بدرخشی):

می‌تونی این جمله رو هم اضافه کنی:

"جالب اینجاست که توی ES6، خود let و const طوری طراحی شدن که برنامه‌نویس رو مجبور کنن کد بهتری بنویسه و از اشتباهات رایج مثل استفاده از متغیر قبل از مقداردهی جلوگیری کنن. این یعنی TDZ یه دوسته، نه یه دشمن! "

مصاحبه فنیجاوااسکریپتjavascript
۰
۰
مصطفی رستگار
مصطفی رستگار
برنامه نویس کامپیوتر و ازین جور مسخره بازی ها!
شاید از این پست‌ها خوشتان بیاید