Hoisting funstions vs hoisting classes

احتمالا تا به حال توی برنامه به یه سری خطاها برخورد کردین که بعد از یکمی سرچ متوجه شدین به خاطر چیزی به نام "Hoisting" این خطا رخ داده. یا اگه (به عنوان یک برنامه‌نویس)، تجربه مصاحبه برای استخدام رو داشته باشید ممکنه ازتون پرسیده باشن که hoisting چی هست؟ توی این مقاله سعی می‌کنم خیلی ساده و مختصر این مفهوم رو توضیح بدم. 1. Hoisting Functionsدر جاوااسکریپت توابع رو می‌تونیم به دوصورت زیر تعریف کنیم.1.1. Function declaration1.2. Function expressionبرای پیاده‌سازی مورد اول کافیه که از کلمه کلیدی function قبل از اسم تابع استفاده کنیم. به اینصورت://function declarationFunction example() {}اما اگه یک متغیر تعریف کنیم (یا constant) و بدنه تابع رو درون این متغیر بریزیم از روش دوم استفاده کردیم.//function expressionConst 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 declarationclass Example {}1.2. Class expression//class expressionConst 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