الدوال

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

يتم اعتبار الدوال على أنّها "الفئة الأولى". مما يعني أنه على الرغم من سلوكها الفريد، إلا أنه يمكن استخدامها في جميع السياقات نفسها مثل أي كائن 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 إنشاء دوال متنوعة أساسية، والتي يمكن قبول عدد متغير من الوسيطات:

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، تعمل بنية مَعلمة else على النحو المتوقّع مع مَعلمات دالة السهم:

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

myOuterFunction( false );
> true

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

myArrowFunction( true );
> true`
``