Mahdi Rahmani
Mahdi Rahmani
خواندن ۳ دقیقه·۳ ماه پیش

درک Hoisting در جاوا اسکریپت: راهنمای جامع !

درک Hoisting در جاوا اسکریپت
درک Hoisting در جاوا اسکریپت

مفهوم Hoisting در جاوااسکریپت

در جاوااسکریپت Hoisting یکی از مفاهیم مهم در جاوااسکریپت است که ممکن است منجر به رفتار غیرمنتظره در کد شود. این مکانیزم باعث می‌شود تا اعلان‌های متغیرها، توابع و کلاس‌ها به بالای محدوده خود منتقل شوند، حتی قبل از اجرای کد. به عبارت دیگر، اعلان (Declarations) متغیرها و توابع به بالای محدوده خود منتقل می‌شوند، اما مقداردهی‌ها (Initializations) در جای خود باقی می‌مانند.


متغیرها در Hoisting :

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

console.log(foo); // undefined var foo = 'bar';

در اینجا، foo به بالای محدوده منتقل شده اما مقداردهی نشده است، بنابراین خروجی undefined خواهد بود.

متغیرها: Hoisting با let و const :

با معرفی let و const در ES6، رفتار متفاوتی نسبت به var اعمال شد. در اینجا متغیرها به منطقه زمانی مرده (Temporal Dead Zone) وارد می‌شوند و اگر پیش از اعلان از آن‌ها استفاده شود، خطای ReferenceError رخ خواهد داد.

console.log(bar); // ReferenceError let bar = 'baz';

توابع در Hoisting :

توابع در جاوااسکریپت به دو صورت تعریف می‌شوند: اعلان توابع (Function Declarations) و تعبیر توابع (Function Expressions).

اعلان توابع :

اعلان توابع به‌طور کامل به بالای محدوده منتقل می‌شود، به همین دلیل می‌توان آن‌ها را قبل از اعلام فراخوانی کرد:

hoistedFunction(); // Outputs: &quotThis function has been hoisted.&quot function hoistedFunction() { console.log(&quotThis function has been hoisted.&quot); }

تعبیر توابع :

عبیر توابع، مانند توابعی که با var, let, یا const تعریف می‌شوند، تنها اعلام متغیر به بالا منتقل می‌شود، اما مقداردهی (تعریف تابع) نه :

console.log(notHoistedFunction); // undefined var notHoistedFunction = function() { console.log(&quotThis function expression is not hoisted.&quot); };

در اینجا، notHoistedFunction به بالا منتقل شده اما مقداردهی نشده است، بنابراین مقدار undefined خواهد بود.


کلاس ها در Hoisting :

کلاس‌ها نیز مشابه با let و const، تنها اعلانشان به بالا منتقل می‌شود و اگر قبل از اعلام کلاس از آن استفاده شود، خطای ReferenceError رخ می‌دهد :

const p = new Rectangle(); // ReferenceError class Rectangle {}

خطرات Hoisting :

می‌تواند Hoisting باعث بروز رفتارهای غیرمنتظره در کد شود، به‌خصوص اگر متغیری را دو بار اعلام کنید. این امر می‌تواند باعث بازنویسی اعلام‌های قبلی شده و اشکال‌زدایی را در پروژه‌های بزرگ دشوار کند.

جلوگیری از مشکلات Hoisting

برای جلوگیری از مشکلات مربوط به Hoisting:

  1. همیشه متغیرها و توابع خود را در بالای محدوده‌شان اعلام کنید. این کار باعث می‌شود کد شما خواناتر و قابل نگهداری‌تر باشد.
  2. از let یا const به جای var استفاده کنید. این باعث می‌شود که متغیرها در منطقه زمانی مرده قرار گیرند و خطاهای احتمالی شناسایی شوند.
  3. استفاده از "strict mode". در حالت strict، استفاده از متغیرهای اعلام نشده مجاز نیست که می‌تواند به شما کمک کند خطاهای مربوط به Hoisting را زودتر شناسایی کنید.

چرا Hoisting پیاده‌سازی شد؟

دو دلیل اصلی برای پیاده‌سازی Hoisting در جاوااسکریپت وجود دارد:

  1. تسهیل استفاده از توابع قبل از اعلامشان: Hoisting به شما امکان می‌دهد که توابع را قبل از تعریف آن‌ها فراخوانی کنید، که باعث انعطاف بیشتر در سازماندهی کد می‌شود.
  2. بهبود کارایی مفسر: Hoisting می‌تواند باعث بهینه‌سازی عملکرد مفسر جاوااسکریپت شود، زیرا مفسر در حین اجرای کد دیگر نیازی به جستجو برای اعلام توابع ندارد و می‌تواند سریع‌تر به اجرای آن‌ها بپردازد.

نتیجه‌گیری

یکی از ویژگی‌های قدرتمند جاوااسکریپت Hoisting است، اما می‌تواند در صورتی که به درستی مدیریت نشود، منجر به بروز مشکلاتی شود. با درک درست از نحوه عملکرد Hoisting و اجتناب از مشکلات مربوط به آن، می‌توانید کد جاوااسکریپت خود را به شکلی پایدارتر و قابل نگهداری‌تر بنویسید.

hoistingjavascriptجاوااسکریپتجاوا اسکریپتهویستینگ
کدنویس دنیای مجازی، با خط و کد، ایده‌ها رو به واقعیت تبدیل می‌کنه! همیشه در حال آپدیت شدن و عاشق خلق دنیاهای جدید و جذاب توی اینترنت است!
شاید از این پست‌ها خوشتان بیاید