الدوال

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

ويتم اعتبار الدوال كائنات من "الفئة الأولى"، ما يعني أنه على الرغم من سلوكها الفريد، يمكن استخدامها في جميع السياقات نفسها مثل أي كائن JavaScript آخر. على سبيل المثال، يمكن تعيين دالة لمتغير، وتمريرها كوسيطة إلى دوال أخرى، وإرجاعها بواسطة دوال أخرى.

function myFunction() {
   console.log( "This is my function." );
};

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

إعلانات الدوال

يُنشئ تعريف الدالة (يسمى أيضًا "عبارة الدالة" أو "تعريف الدالة") دالة مُسمّاة يمكن استدعاءها في مكان آخر في النطاق الذي يحتوي عليها. تتألف إعلانات الدوال من الكلمة الرئيسية function متبوعة بمعرّف، وقائمة من المَعلمات المفصولة بفواصل بين قوسَين، وعبارة حظر تُسمى "نص الدالة". ستصادف بشكل متكرر تعريفات وظائف لا تنتهي بفاصلة منقوطة، ونظرًا لأن تعريف الدالة هو عبارة، يمكن استنتاج العبارات اللاحقة باستخدام ASI.

function myFunction() {
   console.log( "This is my function." );
};

myFunction();
> "This is my function."

بالاستناد إلى قرارات التصميم المبكرة لـ JavaScript، تخضع إعلانات الدوال لسلوك الرفع القديم نفسه كمتغيّرات تم تعريفها باستخدام var، ما يعني أنّ بيان الدالة يتم رفعه إلى أعلى نطاقه، ويمكن استدعاؤه قبل التعريف كنتيجة لذلك، سواء كان هذا النطاق خاضعًا للوضع المتشدد أم لا:

"use strict";
{
    myFunction();
    function myFunction() {
        console.log( "This is my function." );
    };
}
> "This is my function."

خارج وضع صارم، تستخدم إعلانات الدوال سلوك تحديد النطاق القديم في JavaScript، ما يعني أنّ تعريف الدالة يتم تحديده لأقرب دالة تضمين:

function myFunction() {
    function myNestedFunction() {
        console.log( "This is my nested function." );
    }
    myNestedFunction();
};

myFunction();
> "This is my nested function."

myNestedFunction();
>Uncaught ReferenceError: myNestedFunction is not defined

في الوضع المتشدد، يتم تحديد نطاق بيانات الدوال في أقرب جزء تضمين، كما هو الحال مع المتغيّرات التي تم تعريفها باستخدام let أو const:

"use strict";
{
    function myFunction() {
        console.log( "This is my function." );
    };
}

myFunction();
> Uncaught ReferenceError: myFunction is not defined

استدعاء الدوال

كما هو الحال مع المتغيرات، يعمل المعرّف المستخدم عند الإعلان عن دالة كاسم رمزي للقيمة. تؤدي الإشارة إلى دالة حسب المعرّف وحده إلى عرض كائن الدالة فقط، ولا يتم تنفيذ الدالة التي تحتوي عليها:

function myFunction() {
   console.log( "This is my function." );
};

myFunction;
> myFunction() {
   console.log( "This is my function." );
}

لتنفيذ الرمز داخل نص الدالة، عليك استدعاء (أو استدعاء) الدالة باتّباع اسم الدالة مع زوجَين متطابقَين:

function myFunction() {
    console.log( "My function has been executed." );
}

myFunction();
> "My function has been executed."

تعمل المعلمات في تعريف الدالة كمتغيّرات عنصر نائب للقيم التي يمكن تمريرها إلى نص الدالة عند استدعاء الدالة. القيم الموجودة بين الأقواس عند استدعاء دالة هي "الوسيطات" (على الرغم من أنك قد ترى "الوسيطات" المستخدمة لوصف كل من الوسيطات والمعلمات في بعض الوثائق):

function myFunction( myParameter ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction( "this string" );
> "The value is: this string."

إذا تم حذف وسيطة متوقعة، تحتوي المعلمة الناتجة على قيمة undefined، لأن المعلمة يتم تعريفها بنص الدالة ولكن لم يتم إعدادها بقيمة:

function myFunction( myParameter ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction();
> "The value is: undefined."

يمكنك ضبط قيم المَعلمات التلقائية من خلال إعدادها بالطريقة نفسها التي يتم بها إعداد متغيّر، وهو عامل التشغيل: = متبوعًا بقيمة. إذا حددت لاحقًا وسيطة لهذه الدالة، فإن هذه القيمة الجديدة تلغي القيمة الافتراضية:

function myFunction( myParameter = "omitted" ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction( "this string" );
> "The value is: this string."

myFunction();
> "The value is: omitted."

نص الدالة غير السهم يمكنه أيضًا الوصول إلى مصفوفة مفهرسة بصفر صفيفيشبه arguments يحتوي على أي قيم تم تمريرها كوسيطات، سواء كانت الدالة تحدّدها: التعريف:

function myFunction() {
   console.log( arguments );
};

myFunction( 3, true, "My string" );
> Arguments { 0: 3, 1: true, 2: "My string", … }

دوال فارياديك

يتيح لك الكائن arguments إنشاء دوال variadic أساسية، والتي يمكنها قبول عدد متغير من الوسيطات:

function myFunction() {
    let result = "";
    for (let i = 0; i < arguments.length; i++) {
        result += arguments[i] + " - ";
    }
    console.log( result );
};

myFunction( "My first string", "My second string", "my third string" );\
> "My first string - My second string - my third string - "

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

function myFunction( mySeparator, ...myStrings ) {
  console.log( myStrings.join( mySeparator ) );
};

myFunction( " - ", "My first string", "My second string", "my third string" );
> "My first string - My second string - my third string"

على عكس ربط parameter، تعمل بنية المَعلمات الثابتة على النحو المتوقّع مع المَعلمات التي تستخدم الدوال السهمية:

function myOuterFunction() {
    let myInnerArrowFunction = ( ...myParams ) => {
        console.log( myParams[ 0 ] );
    }
    myInnerArrowFunction( true );
};

myOuterFunction( false );
> true

let myArrowFunction = ( ...myParams ) => {
    console.log( myParams[ 0 ] );
};

myArrowFunction( true );
> true`
``