توابع در هر زبانی از اهمیت بالایی بر خوردارند. در نسخههای قبل JavaScript محدودیتهای بالایی در استفاده از توابع موجود بود که ES6 قابلیتهای جالبی به توابع افزوده است.
مقادیر پیش فرض برای ورودیهای تابع در ES6
به مثال زیر توجه کنید:
function test(a = 5, b = 2){
return a + b;
}
console.log(test());
در مثال بالا همانطور که میبینید به ورودیهای تابع test یک عدد نسبت دادیم. کارکرد این نوع مقدار دهی آن جاست که اگر در فراخوانی تابع به ورودی تابع عددی ندهیم، مقادیر پیش فرض استفاده میشوند.
خروجی مثال فوق عدد 7 است.
تابع با ورودی نا مشخص
فرض کنید میخواهیم یک تابع بسازیم که هر چند عددی را که به آن بدهیم جمع کند. مثال زیر را ببینید:
function sum(...values){
var number= 0;
for(var i=0; i < values.length; i++){
number += values[i];
}
return number;
}
console.log(sum(1,2,3,4,5));
ورودی values با سه نقطه قبل از خود آرایهای از تمام ورودیهای دریافت میکند. در سورسهای درون تابع sum آرایه values را پیمایش و کلیه اعداد را جمع میکنیم. و طبیعی است که تفاوتی نمیکند که تابع sum را با چند ورودی صدا کنیم.
خروجی تابع فوق عدد 15 خواهد بود.
البته میتوان تابعی مانند تابع فوق را به ورودیهای دیگری نیز مجهز کرد. فقط توجه داشته باشید که ورودیهای نامشخص باید در انتها باشند و ورودیهای دیگر در ابتدا قرار گیرند:
function sum(message, ...values){
var number= 0;
for(var i=0; i < values.length; i++){
number += values[i];
}
return message + number;
}
console.log(sum("the sum is: ", 1,2,3));
می توان ورودیهای یک تابع را به شکل زیر نیز برای تابع تعیین کرد:
function test(a, b){
return a + b;
}
var arr1 = [1,2];
console.log(test(...arr1));
همانطور که در بالا میبینید برای تبدیل یک آرایه به ورودیهای یک تابع باید از سه نقطه قبل از نام آرایه استفاده کرد. خروجی تابع فوق عدد 3 خواهد بود.
خلاصه نویسی توابع در ES6
می توان به سادگی در ES6 توابع را خلاصه نویسی نمود. مثال زیر را ببینید:
let sum = (a,b) => a+b;
console.log(sum(1,2));
در بالا به صورتی که میبینید تابع sum را در یک سطر ساده خلاصه نویسی و خروجی را مشخص کردیم. به این نوع توابع Arrow Function میگویند.
البته این خلاصه نویسی را میتوان در چند سطر نیز انجام داد. مثال فوق را به شکل زیر مینویسیم:
let sum = (a,b) => {
return a+b;
}
console.log(sum(1,2));
در مثال زیر با استفاده از روش خلاصه نویسی تابع سعی میکنیم از متد map استفاده کنیم:
var arr= [2, 4, 6, 7];
console.log(arr.map(n => ++n));
توابع Generator
این توابع نوع خاصی هستند که غیر از return یک دستور دیگر به نام yield برای ارسال آیتم به خروجی در خود دارند و برای تعریف آنها پس از عبارت function از کاراکتر ستاره استفاده میکنیم. مثال زیر را ببینید:
function* idMaker(){
yield 1;
yield 2;
yield 3;
return 1;
}
var gen = idMaker();
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
در سطر هفت یک شی از روی تابع idMaker ایجاد میکنیم. در سطرهای بعدی با استفاده از next و مقدرا value یک بار این تابع را در خواست میدهیم.
هر بار که تابع درخواست شود یک مقدار چاپ میشود. خروجی اول 1، خروجی دوم 2، خروجی سوم 3، و خروجی چهارم 1 خواهد بود.
پس از رسیدن به return هر چند بار از next استفاده کنید در خروجی undefinded منتشر میشود. خروجی دستور فوق به شرح زیر است:
1
2
3
1
undefined
undefined
اگر تابع را بدون value در خواست دهید در هر بار یک شی چاپ میشود که یک مقدار done دارد که تا وقتی که از yield استفاده کند برابر false است.
نکته: اگر در هر کجا به جای next از return استفاده کنید این تابع generator دیگر مقداری باز نمیگرداند، و به عبارت دیگر غیر فعال میشود.