رهام رفیعی تهرانی
رهام رفیعی تهرانی
خواندن ۲ دقیقه·۳ سال پیش

تفاوت های arrow function و regular function در جاوااسکریپت، بخش اول

دیروز داشتم روی یک API برای ساخت کاربر جدید کار می کردم. میخواستم پسورد کاربر جدید قبل از ذخیره شدن در لیست کاربران، تبدیل به hash بشه.برای انجام این کار رفتم سراغ Schema.prototype.pre و میدونستم که همیشه به صورت زیر ازش استفاده میکنم:

خوشبختانه یا شوربختانه! هوس کردم از arrow function استفاده کنم و کد رو اینطوری نوشتم:

کدم رفت تو دیوار. این ور رو تست کردم، اون ور رو تست کردم، مقادیر رو بررسی کردم و یه چیزایی تو ذهنم داشت شکل میگرفت، یه کم سرچ کردم تا رسیدم به نکته:

در واقع اینجا باید از تابع معمولی استفاده میکردم نه arrow function. مدت ها بود که تفاوت های این دو مُدل تعریف تابع برام یادآوری نشده بود. در نتیجه دوباره مرورشون کردم.

در جاوااسکریپت، پنج تفاوت بین تابع معمولی و arrow function وجود داره. در این مقاله به اولین تفاوت بینشون می پردازیم.


اولین و مهمترین تفاوت بین regular function و arrow function اینه که متغیر this به کجا اشاره میکنه. در تابع معمولی، مقدار this به یک context مشخص اشاره میکنه که تابع درون اون قرار داره. چهار نوع context در جاوااسکریپت داریم که تابع درون اونها قرار میگیره و مالک تابع محسوب میشوند.

1. وقتی که تابع داخل global object تعریف شده:

حالت اول، وقتی تابع در global object نوشته بشه
حالت اول، وقتی تابع در global object نوشته بشه

2. وقتی که تابع در یک object تعریف شده:

حالت دوم، وقتیه که تابع در یک object تعریف شده
حالت دوم، وقتیه که تابع در یک object تعریف شده

3. وقتی که تابع توسط context خاصی صدا زده بشه:

حالت سوم، وقتیه که تابع توسط context خاصی صدا زده بشه
حالت سوم، وقتیه که تابع توسط context خاصی صدا زده بشه

4. وقتی که یک instance جدید از تابع ساخته بشه

حالت چهارم، وقتیه که یک instance جدید از تابع ساخته بشه
حالت چهارم، وقتیه که یک instance جدید از تابع ساخته بشه


اما arrow function اینطوری نیست. این نوع تابع،مقدار this همون آبجکتی رو میگیره که صداش زده. در مثال زیر، متغیر this در تابع myMethod به آبجکت myObject اشاره میکنه. چون تابع callback در تابع myMethod صدا زده میشه، مقدار this تابع callback، برابر با مقدار this تابع myMethod میشه و به آبجکت myObject اشاره میکنه.

بنابر این وقتی تابعی رو از نوع arrow function تعریف میکنیم، دقت کنیم که در کدوم context قراره صداش کنیم. اگر به مثال اول برگردیم، تابع معمولی هرجا که صدا زده بشه، در context مربوط به mongoose schema خاص خودش اجرا میشه و نه context آبجکت صدا زننده.

در تعریف regular function و arrow function، چهار تفاوت دیگه هم هست که در مقاله بعدی می نویسم.

:)




جاوااسکریپتjavascriptarrow functionmongoosemongodb
برنامه نویسی یک شغل نیست، یک هنره.
شاید از این پست‌ها خوشتان بیاید