פונקציות

פונקציה היא בלוק מודולרי של הצהרות לשימוש חוזר, המשמש לביצוע קבוצה משימות קשורות, כמו חישוב והחזרה של ערך על סמך ארגומנטים שניתנו לפונקציה. בדומה לכל הערכים שאינם פרימיטיביים, הפונקציות הן אובייקטים. הם אובייקטים ייחודיים שאפשר לקרוא להם להריץ קוד, להעביר נתונים בצורה של ארגומנטים, ולהחזיר ערך.

פונקציות נחשבות כ"מחלקה ראשונה" אחר, כלומר שלמרות ההתנהגות הייחודית שלהם, ניתן להשתמש בהם בכל אותם הקשרים כמו כל אובייקט JavaScript אחר. לדוגמה, פונקציה יכולה להיות מוקצה למשתנה, מועבר כארגומנט לפונקציות אחרות, ומוחזרת באמצעות פונקציות אחרות.

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

פונקציה שמוגדרת כמאפיין של אובייקט היא שנקראת בדרך כלל "method". בדומה למשתנים שהוצהרו באמצעות var', הצהרות על פונקציה שנוצרו מחוץ לפונקציה מצורפת מתווספות אובייקט גלובלי כ-methods.

הצהרות לגבי פונקציות

הצהרת פונקציה (נקראת גם 'הצהרת פונקציה' או 'הגדרת פונקציה') יוצרת פונקציה בעלת שם שאפשר להפעיל בכל מקום אחר בהיקף שמכיל אותה. הצהרות הפונקציות כוללות את מילת המפתח function ולאחר מכן מזהה, רשימה של פרמטרים מופרדים בפסיקים מוקפים בסוגריים הצהרת חסימה נקראת "function body". לעיתים קרובות תיתקלו בהצהרות של פונקציות שלא מסתיים בנקודה ופסיק; כי הצהרה על פונקציה היא הצהרה, אפשר להסיק נקודה-פסיק באמצעות 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."

הפרמטרים בהגדרת הפונקציה משמשים כמשתני placeholder עבור שאפשר להעביר לגוף הפונקציה כשמתבצעת קריאה לפונקציה. הערכים בסוגריים כשהפונקציה נקראת 'ארגומנטים' (למרות יכול להיות שתראו 'ארגומנטים' משמש לתיאור גם ארגומנטים וגם פרמטרים תיעוד):

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 מודרני משתמשים בגישה הזו לפונקציות שונות רק לעיתים רחוקות ופיתוח. מקובל להשתמש בארכיטקטורה מודרנית וקריאה יותר rest parameterגלה, שיוצר פרמטר בעל שם שאותחל כמערך שמכיל ארגומנטים כלשהם מעבר לאלה שצוינו במפורש:

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`
``