Hoisting funstions vs hoisting classes

احتمالا تا به حال توی برنامه به یه سری خطاها برخورد کردین که بعد از یکمی سرچ متوجه شدین به خاطر چیزی به نام "Hoisting" این خطا رخ داده. یا اگه (به عنوان یک برنامه‌نویس)، تجربه مصاحبه برای استخدام رو داشته باشید ممکنه ازتون پرسیده باشن که hoisting چی هست؟ توی این مقاله سعی می‌کنم خیلی ساده و مختصر این مفهوم رو توضیح بدم.




1. Hoisting Functions

در جاوااسکریپت توابع رو می‌تونیم به دوصورت زیر تعریف کنیم.

1.1. Function declaration

1.2. Function expression

برای پیاده‌سازی مورد اول کافیه که از کلمه کلیدی function قبل از اسم تابع استفاده کنیم. به اینصورت:

//function declaration
Function example() {}


اما اگه یک متغیر تعریف کنیم (یا constant) و بدنه تابع رو درون این متغیر بریزیم از روش دوم استفاده کردیم.

//function expression
Const example = function() {};


اگر برای پیاده‌سازی توابع از روش function declaration استفاده کنیم، می‌تونیم قبل از تعریف تابع اون رو فراخونی کنیم و خطایی هم پیش نخواهد اومد.

example();
.
.
Function example() {}


دلیل اینکه در این شرایط با خطایی مواجه نمی‌شیم این هست که جاوااسکریپت به طور خودکار در هنگامی که کد رو اجرا میکنه، تمامی توابعی که به صورت function declaration پیاده‌سازی شدن رو میاره میزاره اول فایل. (همینطور تمامی متغیرها رو) پس اینطور نیست که همیشه تمامی کدها به صورت خط به خط و به ترتیب اجرا شن.

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

example();
.
.
Const example = function() {};

پس ما نمی‌تونیم از example قبل از خطِ تعریف بدنه تابع استفاده کنیم.


2. Hoisting classes

برای پیاده‌سازی کلاس هم دقیقا مثل توابع دوتا راه داریم.

2.1. Class declaration

//class declaration
class Example {}


1.2. Class expression

//class expression
Const Example = class {};


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

Const ex = new Example(); //ReferenceError: Example in not defined
.
.
class Example {}


راجع به class expression هم شرایط به همین صورت هست و باید حتما ساخت یک instance از کلاس رو بعد از پیاده‌سازی بدنه کلاس قرار بدیم تا با خطا مواجه نشیم.

فکر می‌کنم تا اینجا به مقدار مناسبی با مفهوم hoisting آشنا شده باشید. اگه علاقه به مطالعه بیشتر درین زمینه دارید می‌تونید به لینک‌ زیر مراجعه کنید.

https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

امیدوارم این مقاله براتون مفید بوده باشه. نظر، انتقاد یا پیشنهادی اگر دارین خوشحال میشم بشنوم تا باهم بیشتر یاد بگیریم. موفق باشید.


بقیه مقالات من در ویرگول:

https://virgool.io/@shadishirinbeik/%DB%8C%DA%A9%DB%8C-%D8%AF%DB%8C%DA%AF%D9%87-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D9%85%D9%81%DB%8C%D8%AF-%DA%AF%DB%8C%D8%AA-git-stash-h5176fhfmosv
https://virgool.io/@shadishirinbeik/%D8%A8%D8%A7-git-bisect-%D8%AA%D9%88%DB%8C-%DB%8C%D9%87-%DA%86%D8%B4%D9%85-%D8%A8%D9%87%D9%85-%D8%B2%D8%AF%D9%86-%D8%A8%D8%A7%DA%AF-%D8%B1%D9%88-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D8%AF-agcs3nkn3xqk
https://virgool.io/@shadishirinbeik/%D8%AE%D8%B5%D9%88%D8%B5%DB%8C%D8%AA-%D8%B4%DA%AF%D9%81%D8%AA%D8%A7%D9%86%DA%AF%DB%8C%D8%B2-box-sizing-%D8%AF%D8%B1-css-%D8%B1%D9%88-%D8%A8%D8%B4%D9%86%D8%A7%D8%B3%DB%8C%D8%AF-uh8iyxstgix6
https://virgool.io/@shadishirinbeik/%D8%A7%DA%AF%D9%87-%D9%87%D9%86%D9%88%D8%B2-%D8%A8%D8%A7-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C%D8%AA-position-%D8%AF%D8%B1-css-%D8%B9%D9%85%DB%8C%D9%82%D8%A7%D9%8B-%D8%A2%D8%B4%D9%86%D8%A7-%D9%86%DB%8C%D8%B3%D8%AA%DB%8C%D8%AF-%D8%A7%DB%8C%D9%86-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%B1%D9%88-%D8%A8%D8%AE%D9%88%D9%86%DB%8C%D8%AF-zhyughp5f6al