تفاوت با تابع معمولی

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

در جاوااسکریپت، توابع Arrow (که به نام توابع پیکانی نیز شناخته می‌شوند) و توابع معمولی تفاوت‌های اساسی دارند که بر رفتار و کاربرد آن‌ها تأثیر می‌گذارد. در این مقاله به بررسی این تفاوت‌ها می‌پردازیم.

۱. نحوه تعریف

توابع معمولی با استفاده از کلمه کلیدی function تعریف می‌شوند:

function regularFunction() {
  return "Hello World";
}

در حالی که توابع Arrow با استفاده از نماد => تعریف می‌شوند:

const arrowFunction = () => {
  return "Hello World";
}

۲. رفتار this

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

  • در توابع معمولی، this به شیء فراخوانی‌کننده تابع اشاره می‌کند
  • در توابع Arrow، this از محیط لغوی (lexical context) خود ارث می‌برد
ویژگی تابع معمولی تابع Arrow
this پویا (dynamic) لغوی (lexical)
arguments دارد ندارد
ساختار function() {} () => {}

۳. استفاده از constructor

توابع معمولی می‌توانند به عنوان constructor استفاده شوند و با کلمه کلیدی new نمونه‌سازی شوند، اما توابع Arrow این قابلیت را ندارند:

function Person(name) {
  this.name = name;
}
const p = new Person("John"); // کار می‌کند

const PersonArrow = (name) => {
  this.name = name;
}
const p2 = new PersonArrow("John"); // خطا می‌دهد

۴. شیء arguments

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

function showArgs() {
  console.log(arguments); // کار می‌کند
}

const showArgsArrow = () => {
  console.log(arguments); // خطای ReferenceError
}

۵. سینتکس مختصر

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

// تابع معمولی
function double(x) {
  return x * 2;
}

// تابع Arrow معادل
const doubleArrow = x => x * 2;

برای یادگیری عمیق‌تر درباره توابع Arrow در جاوااسکریپت، می‌توانید اینجا را ببینید.


توابع Arrow در ES6 معرفی شدند تا مشکلات مربوط به this در جاوااسکریپت را حل کنند و سینتکس کدنویسی را ساده‌تر نمایند.

جمع‌بندی

  1. توابع Arrow this را از محیط لغوی خود به ارث می‌برند
  2. نمی‌توان از توابع Arrow به عنوان constructor استفاده کرد
  3. توابع Arrow شیء arguments ندارند
  4. سینتکس توابع Arrow مختصرتر و خوانا تر است
  5. توابع Arrow برای متدهای شیء مناسب نیستند (به دلیل رفتار this)