ال

الدوال في JavaScript

6 تمارين

نبذة عن الدوال

الدالة هي كتلة من الكود المنظَّم القابل لإعادة الاستخدام، تُستخدم لأداء إجراء ما. وتوجد طرق متعددة لتعريف الدوال في JavaScript. سنلقي هنا نظرة على إعلانات الدوال و_تعبيرات الدوال_. أما الاحتمالات الأخرى مثل دوال السهم فسنغطيها في مفاهيم أخرى.

إعلان الدالة

الطريقة القياسية لتعريف دالة في JavaScript هي إعلان الدالة، ويُسمى أيضًا تعريف الدالة أو عبارة الدالة.

يتكون إعلان الدالة من الكلمة المفتاحية function، واسم الدالة، وقائمة معاملات مفصولة بفواصل ومحاطة بأقواس هلالية. ويتبع ذلك جسم الدالة (مجموعة العبارات التي تحدد ما تفعله الدالة) محاطًا بأقواس معقوفة.

function someName(param1, param2, param3) {
  // ...
}

استخدام الدالة

في JavaScript، تُستدعى الدالة (أي يُنادى عليها) بذكر اسم الدالة متبوعًا بأقواس هلالية تحتوي على الوسائط.

someName(arg1, arg2, arg3);

مجرد ذكر اسم الدالة لا يستدعي الدالة في JavaScript.

function sayHello() {
  console.log('Hello, World!');
}

sayHello;
// => [Function: sayHello]
// The text representations varies between environments.

sayHello();
// => 'Hello, World!'

المعاملات

عند التعامل مع المعاملات داخل جسم الدالة، انتبه إلى الآثار الجانبية المحتملة على القيمة الأصلية التي مُرّرت إلى الدالة. في JavaScript، الوسيط هو نسخة من مرجع إلى القيمة الأصلية. وما يعنيه هذا عمليًا يعتمد على نوع بيانات الوسيط.

  • قيم أنواع البيانات الأولية غير قابلة للتغيير. فكل «التعديلات» تُنشئ دائمًا قيمة أولية جديدة. ولهذا لا تتأثر القيمة الأصلية أبدًا بما يحدث للوسيط داخل جسم الدالة.

    const num = 0;
    
    function increase(number) {
      number = number + 1;
    }
    
    increase(num);
    num;
    // => 0
    
  • الأمر مختلف مع القيم مثل الكائنات و_المصفوفات_ و_الدوال_. ولأن المرجع يُنسخ، فإن إعادة الإسناد لن تؤثر على القيمة الأصلية. لكن لأنك تتعامل مع نسخة سطحية، فإن تعديل الوسيط داخل جسم الدالة سيغيّر أيضًا القيمة الأصلية التي مُرّرت.

    const nums = [0, 1, 2, 3, 4];
    
    function pushFive(arr) {
      arr.push(5);
    }
    
    pushFive(nums);
    nums;
    // => [0, 1, 2, 3, 4, 5]
    

افتراضيًا، جميع المعاملات المعرّفة في إعلان الدالة اختيارية في JavaScript. وإذا مُرّر إلى الدالة عدد من الوسائط أقل من عدد المعاملات، فستكون الوسائط الناقصة undefined داخل جسم الدالة، انظر القيم الفارغة وغير المعرّفة. في كثير من الحالات، يكون من المنطقي أكثر تهيئة المعامل بقيمة افتراضية إذا لم تُمرَّر أي قيمة أو مُرّرت قيمة undefined. ويمكن فعل ذلك بتحديد معاملات افتراضية مباشرةً في تعريف الدالة.

function someName(param1 = defaultValue1, param2 = defaultValue2) {
  // ...
}

يمكن استدعاء الدالة (نداؤها) بعدد من الوسائط أكبر من عدد المعاملات في تعريف الدالة. ويمكن العثور على جميع الوسائط، بما فيها تلك الوسائط الزائدة، في «مصفوفة» الوسائط.

ومن الممكن أيضًا تعريف دوال تقبل عددًا غير محدد من الوسائط (الدوال متغيرة العدد)، انظر معاملات الباقي في معاملات الباقي وعوامل النشر لمزيد من التفاصيل.

عبارة الإرجاع

تُنهي عبارة return تنفيذ الدالة وتحدد قيمة تُرجع إلى مستدعي الدالة. ويمكن أن تحتوي الدالة على عدة عبارات return.

function checkNumber(num) {
  if (num === 0) {
    return 'You passed 0, please provide another number.';
  }

  return 'Thanks for passing such a nice number.';
}

نتيجة الدالة التي لا return قيمة أو التي ليس فيها عبارة return هي undefined. ولا توجد عبارات return ضمنية في JavaScript.

function nakedReturn(a) {
  a * 2;
  return;
}

nakedReturn(1);
// => undefined

function noReturn(a) {
  a * 2;
}

noReturn(1);
// => undefined

في JavaScript، يمكنك إرجاع قيمة واحدة فقط. وإذا أردت تمرير معلومات أكثر، فعليك جمعها أولًا في كيان واحد، عادةً في كائن أو مصفوفة.

function divide(a, b) {
  return {
    quotient: Math.floor(a / b),
    remainder: a % b,
  };
}

تعبير الدالة

إعلان الدالة عبارة مستقلة بذاتها. لكن من المفيد أحيانًا تعريف دالة كجزء من تعبير آخر، مثل داخل إسناد، أو كمعامل دالة (دالة رد الاتصال)، أو كقيمة في كائن. ويمكن فعل ذلك بتعبير الدالة. وله الصياغة نفسها التي لإعلان الدالة، إلا أنه يمكن حذف اسم الدالة لإنشاء دالة مجهولة.

const someFunction = function (param) {
  // ...
};

someOtherFunction(function (param) {
  // ...
});

const obj = {
  someFunction: function (param) {
    // ...
  },
};

النطاق

تقدّم الدالة سياق تنفيذ جديد في JavaScript. فالمتغيرات المعرّفة داخل دالة لا يمكن الوصول إليها من خارج تلك الدالة. لكن المتغيرات المعرّفة في النطاق الأب (النطاق الذي عُرّفت فيه الدالة نفسها) يمكن الوصول إليها داخل الدالة. ويعرض توثيق MDN حول النطاق أمثلة على هذا السلوك.

ألقِ نظرة على الإغلاقات لتتعلم المزيد عن نطاق المتغيرات في JavaScript.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم الدوال