تفاوت با تابع معمولی
تفاوتهای تابع Arrow با تابع معمولی در جاوااسکریپت
در جاوااسکریپت، توابع Arrow (که به نام توابع پیکانی نیز شناخته میشوند) و توابع معمولی تفاوتهای اساسی دارند که بر رفتار و کاربرد آنها تأثیر میگذارد. در این مقاله به بررسی این تفاوتها میپردازیم.
۱. نحوه تعریف
توابع معمولی با استفاده از کلمه کلیدی function تعریف میشوند:
return "Hello World";
}
در حالی که توابع Arrow با استفاده از نماد => تعریف میشوند:
return "Hello World";
}
۲. رفتار this
مهمترین تفاوت این دو نوع تابع در رفتار this است:
- در توابع معمولی، this به شیء فراخوانیکننده تابع اشاره میکند
- در توابع Arrow، this از محیط لغوی (lexical context) خود ارث میبرد
ویژگی | تابع معمولی | تابع Arrow |
---|---|---|
this | پویا (dynamic) | لغوی (lexical) |
arguments | دارد | ندارد |
ساختار | function() {} | () => {} |
۳. استفاده از constructor
توابع معمولی میتوانند به عنوان constructor استفاده شوند و با کلمه کلیدی new نمونهسازی شوند، اما توابع Arrow این قابلیت را ندارند:
this.name = name;
}
const p = new Person("John"); // کار میکند
const PersonArrow = (name) => {
this.name = name;
}
const p2 = new PersonArrow("John"); // خطا میدهد
۴. شیء arguments
توابع معمولی به شیء arguments دسترسی دارند که شامل تمام پارامترهای ارسال شده به تابع است. توابع Arrow این ویژگی را ندارند:
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 در جاوااسکریپت را حل کنند و سینتکس کدنویسی را سادهتر نمایند.
جمعبندی
- توابع Arrow this را از محیط لغوی خود به ارث میبرند
- نمیتوان از توابع Arrow به عنوان constructor استفاده کرد
- توابع Arrow شیء arguments ندارند
- سینتکس توابع Arrow مختصرتر و خوانا تر است
- توابع Arrow برای متدهای شیء مناسب نیستند (به دلیل رفتار this)