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 Git stash”>

یکی دیگه از دستورات مفید گیت --> Git stash”>
							</div>
<div class=
یکی دیگه از دستورات مفید گیت –> Git stash
با خوندن این مقاله یاد می‌گیرین که چجوری بدون کامیت کردن، کدتون رو ذخیره کنید

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

با Git bisect توی یه چشم بهم زدن باگ رو پیدا کنید!
با Git bisect توی یه چشم بهم زدن باگ رو پیدا کنید!
این مقاله شما رو با یکی از دستورات گیت آشنا میکنه

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

خصوصیت شگفت‌انگیز Box-Sizing در CSS رو بشناسید!
خصوصیت شگفت‌انگیز Box-Sizing در CSS رو بشناسید!
یه Property ساده و کار را بنداز!

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

اگه هنوز با خصوصیت Position در CSS عمیقاً آشنا نیستید این مقاله رو بخونید!
اگه هنوز با خصوصیت Position در CSS عمیقاً آشنا نیستید این مقاله رو بخونید!
اگه تا به حال روش کار Position رو درک نکردین این مقاله میتونه کمکتون کنه

نویسنده مطلب: Shadi Shirinbeik

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.