توابع در جاوااسكريپت با كي وردfunction تعريف ميشوند .تعريف تابع را بصورت declarationيا expression ميتوان استفاده كرد .
قبلا تعريف تابع در مطالب ارائه شده تابع مطابق فرمت كلي(Syntax) زير ارائه گرديد
function functionName(parameters) {
// code to be executed
}
توابع اعلام شده بلافاصله اجرا نميشوند، آنها براي استفاده هاي بعدي ذخيره ميشوند .اجراي آنها در هنگام فراخواني تابع(called upon) است.
مثال ـ تعريف تابع
function myFunction(a, b) { return a * b; }
سميكالن براي جداسازي دستورات اجرائي جاوااسكريپت استفاده ميشود .از آنجائيگه تعريف تابع يك دستور اجراي نيست، انتهاي آن هم قراردادن سميكالن معمول نيست.
يك تابع در جاوااسكريپت ميتواند در يك عبارت تعريف گردد .يك عبارت تابعي در يك متغير ذخيره ميشود.
مثال ـ عبارت تابعي
const x = function (a, b) {return a * b};
بعداز اينكه يك عبارت تابعي در يك متغير ذخيره گرديد، متغير بعنوان يك تابع قابل استفاده ميباشد.
مثال ـ استفاده از متغير تابعي
const x = function (a, b) {return a * b}; let z = x(4, 3);
تابع بالا در واقع يك تابع ناشناس وبي نام(function without a name) است .
تابع ذخيره شده در متغير نياز به نامگذاري ندارد، آن ها هميشه توسط متغير فراخوان ميشوند.
توجه ـ تابع عبارتي بالا با سميكالن پايان يافته است، چون آن قسمتي از يك دستور اجرائي است.
آنچكه در مثال قبلي مشاهده كرديد، تابع جاوااسكريپت بوسيله كي وردfunction تعريف گرديده است.
توابع را ميتوان با تابع سازنده داخليFunction( ) نيز تعريف نمود .
مثال ـ تعريف تابع، با تابع سازند
const myFunction = new Function("a", "b", "return a * b"); let x = myFunction(4, 3);
در واقع لازم نيست از تابع سازنده استفاده نمائيد، مثال بالا بدون تابع سازنده مطابق زير نوشته ميشود.
const myFunction = function (a, b) {return a * b}; let x = myFunction(4, 3);
بيشتر اوقات ميتوانيد از استفادهnew جاوااسكريپت اجتناب كنيد .
در فصول گذشته در مورد استقرار دربالا براي جاوااسكريپت بحث گرديد .اين مطلب را در فصل JavaScript Hoisting دنبال كنيد.
بالا بردن تعاريف در يك ميدان روش پيش فرض جاوااسكريپت است، كه آنها را دربالاي ميدان جاري قرار دهد .تعاريف متغير ها و توابع مشمول اين رفتار پيش فرض ميشود .بهمين دليل تابع قبل از استفاده ، ميتواند فراخوان شود.
myFunction(5); function myFunction(y) { return y * y; }
توابعي كه با استفاد از عبارت تعريف شده اند مشمول بالا بردن نيستند.
تابع عبارتي را ميتوان خودفراخوان ساخت .يك تابع عبارتي خود فراخوان، در شروع بصورت خودكار فراخوان ميشود.
اگر عبارت تابع با() دنبال شود، تابع بصورت خودكار اجرا ميشود .
بايد اطراف عبارت تابعي پرانتز قرا گيرد، تا نشان داده شود كه عبارت تابع است.
مثال ـ تابع خود فراخوان
(function () {
let x = "Hello!!"; // I will invoke myself
})();
تابع فوق در واقع يك تابع ناشناس خود فراخوان است.
توابع جاوااسكريپت ميتوانند مشابه مقدار استفاده شوند.
مثال ـ استفاده تابع مشابه مقدار
function myFunction(a, b) { return a * b; } let x = myFunction(4, 3);
توابع جاوااسكريپت ميتوانند در عبارات مورد استفاده قرار گيرند.
مثال ـ استفاده تابع در عبارت
function myFunction(a, b) { return a * b; } let x = myFunction(4, 3) * 2;
عملگرtypeof بر روي يك تابع نتيجه "function" را برگشت ميدهد . اما، توابع جاوااسكريپت را ميتوان به بهترين شكل به عنوان اشياء توصيف نمود.آنها داراي ويژگي ومتد ميباشند.
ويژگيargument.Length تعداد آرگومانهاي تابع را برگشت ميدهد .
مثال ـ ويژگي تعداد آرگومان تابع
function myFunction(a, b) { return arguments.length; }
متدtoString( ) تابع را بصورت رشته برگشت ميدهد .
مثال ـ متدtoString( ) روي تابع
function myFunction(a, b) { return a * b; } let text = myFunction.toString();
تابعي كه به عنوان ويژگي يك شئ تعريف ميشود، به آن متد شئ ميگويند.
تابعي كه براي ايجاد اشياء جديد طراحي شده، سازنده شئ ناميده ميشود.
توابع پيكاني فرمت كوتاهي(short Syntax) است براي تعريف ويا نوشتن عبارات تابعي
در اين فرم نياز به كي وردfunction ،return و براكت نمي باشد.
مثال ـ نمونه تابع عبارتي وپيكاني
// ES5
var x = function(x, y) {
return x * y;
}
// ES6
const x = (x, y) => x * y;
در توابع پيكانيthis كار نميكند، آنها براي متدهاي شئي مناسب نيستند .
اين نوع توابع داراي امكان بالا رفتن را مشابه توابع معمولي ندارند .وبايد حتما قبل ازاستفاده تعريف شده باشند.
استفاده ازconst ايمن تر ازvarاست، زيرا يك عبارت تابع هميشه مقدار ثابتي دارد.
تنها در صورتي مي توانيد كي وردreturn وبراكت را درآن حذف كنيد كه آن فقط يك دستور داشته باشد .اما بهتراست هميشه آنهارا استفاده نمائيد.
مثال ـ تابع پيكاني مناسب
const x = (x, y) => { return x * y };
توابع پيكاني درIE11 وقبلي هاي آن پشتيباني نميشوند .