تفاوت functionarrow

تفاوت‌های کلیدی بین Function معمولی و Arrow Function در جاوااسکریپت

در جاوااسکریپت، دو روش اصلی برای تعریف توابع وجود دارد: Function معمولی و Arrow Function. هر کدام ویژگی‌های منحصر به فردی دارند که در موقعیت‌های مختلف مفید هستند. در این مقاله به بررسی تفاوت‌های این دو روش می‌پردازیم.


1. نحوه تعریف و سینتکس

اولین تفاوت آشکار در نحوه نوشتن این توابع است:

  • Function معمولی: function myFunc() { ... }
  • Arrow Function: const myFunc = () => { ... }

Arrow Functionها مختصرتر هستند، به خصوص وقتی بدنه تابع یک خطی باشد:

const square = x => x * x; // بدون نیاز به return و آکولاد

2. رفتار this

مهم‌ترین تفاوت در رفتار this است:

نوع تابع رفتار this
Function معمولی مقدار this به شیء فراخوانی‌کننده بستگی دارد
Arrow Function this از محیط بیرونی (lexical scope) به ارث می‌برد

برای درک بهتر مفهوم Hoisting در جاوااسکریپت که به توابع معمولی مربوط می‌شود، می‌توانید کلیک کنید.

3. استفاده به عنوان Constructor

توابع معمولی می‌توانند به عنوان constructor استفاده شوند:

function Person(name) {
  this.name = name;
}
const john = new Person('John');

اما Arrow Functionها نمی‌توانند با new فراخوانی شوند و خطا می‌دهند.

4. arguments و super

توابع معمولی به شیء arguments دسترسی دارند، اما Arrow Functionها این ویژگی را ندارند:

  1. در Arrow Functionها باید از پارامترهای rest استفاده کرد
  2. Arrow Functionها نمی‌توانند super را در کلاس‌ها به کار ببرند

جمع‌بندی و انتخاب بین دو روش

در انتخاب بین این دو نوع تابع باید به موارد زیر توجه کرد:

از Arrow Function استفاده کنید وقتی:

  • به lexical this نیاز دارید
  • توابع کوتاه و یک خطی دارید
  • در callbackها استفاده می‌کنید

از Function معمولی استفاده کنید وقتی:

  • به constructor نیاز دارید
  • به arguments یا super دسترسی نیاز است
  • توابعی دارید که به مقدار this پویا نیاز دارند

درک این تفاوت‌ها به شما کمک می‌کند کدهای بهینه‌تر و خواناتری بنویسید و از خطاهای رایج در کار با this جلوگیری کنید.