تعبير تعريف الدوال

من موسوعة حسوب

الكلمة المحجوزة function تُستخدَم لتعريف دالة داخل تعبير (expression). يمكنك أيضًا تعريف الدوال عبر التصريح عنها function declaration أو عبر الدالة البانية Function.

البنية العامة

var myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
   statements
};

name

اسم الدالة، ويمكن حذفه وحينئذٍ ستسمى الدالة بالدالة المجهولة؛ واسم الدالة لن يكون متاحًا إلا داخل الدالة نفسها (يمكن أن يستعمل لتنفيذها تعاوديًا [recursively]).

param

اسم الوسيط المُرَّر إلى الدالة، العدد الأقصى للوسائط التي يمكن تمريرها إلى الدالة يختلف حسب المحرِّك الذي يُفسِّر اللغة.

statements

التعابير البرمجية التي تُشكِّل جسم الدالة.

الوصف

تعابير تعريف الدوال تشبه كثيرًا (وتكاد تماثل) طريقة التصريح عن الدالة (function declaration)، والفرق الرئيسي بينهما هو اسم الدالة، الذي يمكن حذفه في تعابير تعريف الدوال لإنشاء دوال مجهولة (anonymous function)؛ ويمكن أن استدعاء تعبير تعريف الدالة مباشرةً (ويسمى ذلك Immediately Invoked Function Expression اختصارًا IIFE) مما يؤدي إلى تنفيذ الدالة بعد تعريفها مباشرةً.

استدعاء الدالة قبل تعريفها

لا يمكن استدعاء الدوال المُعرَّفة عبر تعابير تعريف الدوال (function expressions) في JavaScript قبل تعريفها، وذلك على النقيض من الدوال المُصرَّح عنها (function declarations):

notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function() {
   console.log('bar');
};

تعابير تعريف الدالة مع تحديد اسم لها

إذا أردتَ الإشارة إلى الدالة الحالية داخل جسم الدالة، فعليك إنشاء تعبير تعريف للدالة مع اسم، وهذا الاسم محليٌ وخاصٌ بالدالة ولا يمكن استخدامه خارج مجالها، لكن الغرض منه هو تجنب استخدام الخاصية arguments.callee:

var math = {
  'factorial': function factorial(n) {
    if (n <= 1)
      return 1;
    return n * factorial(n - 1);
  }
};

المتغير الذي سيُسنَد إلى الدالة سيكون له خاصية (property) باسم name، ولن يتغيّر الاسم لو أُعيد إسناده إلى متغيرٍ آخر، وإذا حُذِفَ اسم الدالة فستكون قيمة تلك الخاصية مساويةً لاسم المتغير، وسينطبق المثل على الدوال السهمية (التي لا تملك اسمًا خاصًا بها، لذا ستُعطى اسم المتغير الذي أُسنِدَت إليه):

var foo = function() {}
foo.name // "foo"

var foo2 = foo
foo2.name // "foo"

var bar = function baz() {}
bar.name // "baz"

أمثلة

يعُرِّف المثال الآتي دالةً مجهولةً ويُسنِدُها إلى المتغير x، لاحظ أنَّ الدالة ستُعيد مربّع الوسيط المُمرَّر إليها:

var x = function(y) {
   return y * y;
};

ومن الشائع استخدام الدوال المجهولة في معالجة الأحداث:

button.addEventListener('click', function(event) {
    console.log('button is clicked!')
})

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات