Fungsi

Fungsi adalah blok pernyataan modular dan dapat digunakan kembali yang digunakan untuk melakukan serangkaian tugas terkait, seperti menghitung dan menampilkan nilai berdasarkan argumen yang diberikan ke fungsi tersebut. Seperti halnya semua nilai non-primitif, fungsi adalah objek. Argumen ini adalah objek unik karena dapat dipanggil untuk mengeksekusi kode, data yang diteruskan dalam bentuk argumen, dan return nilai.

Fungsi dianggap sebagai objek "first class", yang berarti bahwa meskipun memiliki perilaku unik, fungsi dapat digunakan dalam semua konteks yang sama seperti objek JavaScript lainnya. Misalnya, fungsi dapat ditetapkan ke suatu variabel, diteruskan sebagai argumen ke fungsi lain, dan ditampilkan oleh fungsi lain.

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

Fungsi yang ditentukan sebagai properti objek biasanya disebut "metode". Seperti halnya variabel yang dideklarasikan menggunakan var`, deklarasi fungsi yang dibuat di luar fungsi pembatas ditambahkan ke objek global sebagai metode.

Deklarasi fungsi

Deklarasi fungsi (juga disebut "pernyataan fungsi" atau "definisi fungsi") membuat fungsi bernama yang dapat dipanggil di tempat lain dalam cakupan yang memuatnya. Deklarasi fungsi terdiri dari kata kunci function diikuti dengan ID, daftar parameter yang dipisahkan koma yang diapit tanda kurung, dan pernyataan blok yang disebut "isi fungsi". Anda akan sering menemukan deklarasi fungsi yang tidak diakhiri dengan titik koma; karena deklarasi fungsi adalah pernyataan, titik koma di akhir dapat ditentukan dengan ASI.

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

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

Sebagai sisa dari keputusan desain awal JavaScript, deklarasi fungsi tunduk pada perilaku pengangkatan lama yang sama seperti variabel yang dideklarasikan dengan var, yang berarti bahwa deklarasi fungsi diangkat ke bagian atas cakupannya, dan dapat dipanggil sebelum deklarasi sebagai hasilnya, baik cakupan tersebut diatur oleh mode ketat atau tidak:

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

Di luar mode ketat, deklarasi fungsi menggunakan perilaku cakupan lama JavaScript, yang berarti bahwa deklarasi fungsi disertakan ke fungsi berikut yang terdekat:

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

Dalam mode ketat, deklarasi fungsi dicakup ke blok pembatas terdekat, seperti variabel yang dideklarasikan menggunakan let atau const:

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

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

Panggilan fungsi

Seperti halnya variabel, ID yang digunakan saat mendeklarasikan fungsi berfungsi sebagai nama simbolis untuk suatu nilai. Mereferensikan fungsi berdasarkan ID saja hanya akan menampilkan objek fungsi, dan tidak mengeksekusi fungsi yang ada di dalamnya:

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

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

Untuk menjalankan kode di dalam isi fungsi, panggil (atau panggil) fungsi dengan mengikuti nama fungsi dengan sepasang tanda kurung yang cocok:

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

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

Parameter dalam definisi fungsi bertindak sebagai variabel placeholder untuk nilai yang dapat diteruskan ke isi fungsi saat fungsi dipanggil. Nilai-nilai dalam tanda kurung saat fungsi dipanggil adalah "argumen" (meskipun Anda mungkin melihat "argumen" yang digunakan untuk menjelaskan argumen dan parameter dalam beberapa dokumentasi):

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

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

Jika argumen yang diharapkan dihilangkan, parameter yang dihasilkan akan berisi nilai undefined, karena parameter dideklarasikan ke isi fungsi, tetapi tidak diinisialisasi dengan nilai:

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

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

Anda dapat menetapkan parameter value default dengan melakukan inisialisasi seperti saat menginisialisasi variabel: operator penetapan (=) diikuti dengan nilai. Jika nantinya Anda menentukan argumen untuk fungsi tersebut, nilai baru tersebut akan menggantikan nilai default:

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

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

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

Isi fungsi non-panah juga memiliki akses ke objek arguments seperti array dengan indeks nol, yang berisi nilai apa pun yang diteruskan sebagai argumen, terlepas dari apakah definisi fungsi menentukan parameter atau tidak:

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

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

Fungsi variadic

Objek arguments memungkinkan Anda membuat fungsi variadic dasar, yang dapat menerima sejumlah variabel argumen:

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

Namun, pendekatan terhadap fungsi variadic ini jarang digunakan dalam pengembangan JavaScript modern. Biasanya, penggunaan sintaksis parameter istirahat yang lebih modern dan mudah dibaca akan membuat parameter bernama yang diinisialisasi sebagai array yang berisi argumen apa pun di luar yang ditentukan secara eksplisit:

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"

Tidak seperti binding parameter, sintaksis parameter lainnya berfungsi seperti yang diharapkan dengan parameter fungsi panah:

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

myOuterFunction( false );
> true

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

myArrowFunction( true );
> true`
``