برنامه نویسی 138 بازدید

تقریباً سه سال از زمانی که تابع‌های arrow به جاوا اسکریپت اضافه شده‌اند، می‌گذرد و این توابع به یکی از محبوب‌ترین ویژگی‌های این زبان برنامه‌نویسی تبدیل شده‌اند.

مزایای اصلی تابع‌های Arrow:

  • ساختار خلاصه‌تر نسبت به تابع‌های نرمال
  • عدم اتصال (bind) به this

در این مقاله ساختار فشرده‌تر تابع‌های arrow را بررسی کرده و همچنین آن‌ها را با معادل‌های نرمالشان مقایسه می‌کنیم. در نهایت دو قاعده برای درک بهتر ساختار تابع‌های arrow ارائه می‌کنیم.

اگر حس می‌کنید ابتدا باید اطلاعات خود را در مورد تابع‌های جاوا اسکریپت بازنگری بکنید پیشنهاد می‌کنیم پیش از ادامه این نوشته مقاله «راهنمای جامع تابع‌های جاوا اسکریپت» را مطالعه کنید.

ساختار عبارت تابعی

عبارت تابعی یک شیء تابع ناشناس است که برابر با یک متغیر گرفته می‌شود. دلیل ناشناس بودن این تابع آن است که نامی ندارد. ساختار آن شامل کلیدواژه function و سپس صفر یا چند parameters است و در انتها statements تابع می‌آیند.

ساختار این تابع چیزی شبیه زیر است:

const name = function(parameters){
   statements
}

یک مثال واقعی از چنین تابعی به صورت زیر خواهد بود:

const double = function(num){
   return num * 2;
}

در این مثال شیء تابع ناشناس خود را برابر با متغیر double در نظر گرفتیم. Function ما یک پارامتر به نام num می‌گیرد و یک عبارت به صورت num * 2 دارد.

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

double(3);
// 6

ساختار تابع Arrow

یک تابع arrow مشابه عبارت تابعی است و تنها تفاوت این است که کوتاه‌تر است. در این مورد نیز یک تابع ناشناس به یک متغیر دارای نام انتساب می‌یابد. ساختار تابع arrow شامل صفر یا چند پارامتر، در ادامه یک فلش <= و سپس در انتها عبارت‌های تابع است:

const name = (parameters) => {
   statements
}

اگر از مثال واقعی قبلی استفاده کنیم، تابع double ما با ساختار arrow خود مانند زیر خواهد بود:

const double = (num) => {
   return num * 2;
}

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

// Function Expression

const doubleEXP = function(num){
   return num * 2;
}

// Arrow Function

const doubleARR = (num) => {
   return num * 2;
}

همه کاری که انجام داده‌ایم این است که کلیدواژه function را حذف کردیم و آن را با <= جایگزین کرده‌ایم.

می‌بینید که هر دو تابع هنگام فراخوانی، نتیجه یکسانی را بازمی‌گردانند:

doubleEXP(3);
// 6

doubleARR(3);
// 6

این هم نوعی پیشرفت محسوب می‌شود؛ اما واقعیت این است که تابع arrow می‌تواند بسیار بیش از این ساده‌تر شود. در واقع می‌تواند کاملاً فشرده شود. برای نمونه تابع double فوق را می‌توان به صورت زیر نوشت:

const double = num => num * 2;

کارکرد این تابع همانند تابع فوق است.

گرچه این وضعیت کمی سردرگم کننده به نظر می‌رسد؛ اما با ادامه مطالعه این مقاله دلیل این که چرا این دو تابع یکسان هستند را درخواهید یافت:

const double = (num) => {
return num * 2;
}

// Is the same as

const double = num => num * 2;

پارامترهای تابع Arrow

وقتی پارامترهای تابع arrow را بررسی می‌کنیم، باید به خاطر داشته باشیم که تعداد پارامترها در یک تابع arrow بر ساختار آن تابع تأثیر دارد.

اگر 0 پارامتر وجود داشته باشد، در تابع arrow از پرانتز خالی استفاده می‌شود:

() => { statements }

اگر 1 پارامتر وجود داشته باشد، در تابع arrow می‌توان پرانتزها را از پیرامون آن پارامتر برداشت:

parameter => { statements }

اگر 2 پارامتر یا بیشتر وجود داشته باشند، در این صورت پارامترها باید درون پرانتز قرار گیرند:

(param1, param2, ...) => { statements }

اینک به مثال double پیشین خود باز می‌گردیم. با استفاده از قواعدی که در بخش فوق اشاره کردیم می‌بینیم که وقتی تابع arrow یک پارامتر داشته باشد؛ می‌توانیم پرانتزها را حذف کنیم. این وضعیت در کد زیر مشخص است:

const double = (num) => {
return num * 2;
}

// Is the same as

const double = num => num * 2;

بازگشتی از تابع Arrow

تابع‌های Arrow روشی درونی برای کوتاه‌سازی ساختار بازگشتی نیز دارند. بدین ترتیب که اگر تابع arrow صرفاً یک خط کد را بازگشت می‌دهد، می‌توانید براکت‌های عبارت و کلیدواژه return را حذف کنید. بدین ترتیب تابع arrow می‌تواند عبارت موردنظر را بازگشت دهد.

عبارت تابعی زیر را در نظر بگیرید:

let name = function(parameters){
   return expression
}

آن را می‌توان به صورت زیر خلاصه کرد:

let name = (parameters) => expression

با به خاطر سپردن این مسئله اگر بخواهیم مثال اولیه double خود مقداری را بازگشت دهیم می‌توانیم به شیوه تأثیر این قاعده بر نمونه کد خودمان نگاهی داشته باشیم:

const double = (num) => {
   return num * 2;
}

// Is the same as

const double = num => num * 2;

نتایج کلیدی

  • تعداد پارامترهایی که یک تابع arrow می‌پذیرد، کلید تعیین ساختار تابع است.
  • اگر یک خط کد از یک تابع arrow بازگشت می‌یابد، می‌توان پرانتزها و کلیدواژه return را حذف کرده و صرفاً عبارت بازگشتی را نوشت.

چالش‌ها

یکی از روش‌های سرگرم‌کننده برای درک و یادگیری این قواعد تشکیل دهنده ساختار تابع‌های arrow تلاش برای تبدیل عبارت‌های تابعی به یک تابع arrow است. در ادامه سه چالش ارائه شده است تا ببینید آیا می‌توانید آن‌ها را به تابع‌های arrow تبدیل کنید یا نه.

چالش شماره 1

const add3 = function(num1, num2, num3){
   return num1 + num2 + num3;
}

چالش شماره 2

const square = function(num){
   return num ** 2;
}

چالش شماره 3

const sayHi = function(){
   console.log('Hi');
}

در این بخش پاسخ چالش‌های فوق ارائه شده است، ولی قویاً توصیه می‌کنیم قبل از مطالعه پاسخ‌ها شانس خود را برای حل تمرین‌های فوق بررسی کنید.

پاسخ چالش شماره 1

در این چالش سه پارامتر وجود دارند و بنابراین باید درون پرانتز قرار گرفتند. ما یک عبارت منفرد را بازگشت می‌دهیم و لذا می‌توانیم پرانتزها و عبارت return را حذف کنیم:

const add3 = (num1, num2, num3) => num1 + num2 + num3;

پاسخ چالش شماره 2

این چالش کاملاً شبیه مثال double قبلی ما است. یک پارامتر وجود دارد و لذا می‌توانیم پرانتزها را حذف کنیم. یک عبارت بازگشت می‌یابد و بنابراین می‌توانیم براکت‌ها و return را حذف کنیم.

const square = num => num ** 2;

پاسخ چالش شماره 3

این سؤال کمی نیاز به دقت دارد. آیا متوجه نکته انحرافی شدید؟ هیچ پارامتری وجود ندارد و لذا از پرانتزهای خالی استفاده می‌کنیم. ما هیچ چیز باز نمی‌گردانیم و قصدمان صرفاً logging است. بنابراین هیچ میانبری برای عبارت وجود ندارد:

const sayHi = () => {
   console.log('Hi');
}

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای 1 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *