Fungsi

Fungsi adalah blok pernyataan modular yang dapat digunakan kembali yang digunakan untuk melakukan tugas terkait, seperti menghitung dan menampilkan nilai berdasarkan argumen yang disediakan untuk fungsi. Seperti halnya semua nilai non-primitif, fungsi adalah objek. Keduanya adalah objek unik karena dapat dipanggil menjalankan kode, meneruskan data dalam bentuk argumen, dan menampilkan nilai.

Fungsi dianggap sebagai "first class" yang berarti meskipun perilakunya unik, objek tersebut dapat digunakan di semua konteks yang sama seperti objek JavaScript lainnya. Misalnya, suatu fungsi dapat ditetapkan ke variabel, diteruskan sebagai argumen ke fungsi lain, dan dikembalikan oleh fungsi-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 yang mencakup 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 menampungnya. Deklarasi fungsi terdiri dari kata kunci function diikuti dengan yaitu daftar parameter yang dipisahkan koma yang diapit oleh tanda kurung, dan pernyataan blokir yang disebut "isi fungsi". Anda akan sering menemukan deklarasi fungsi yang tidak diakhiri dengan titik koma; karena deklarasi fungsi adalah pernyataan, di akhir titik koma dapat disimpulkan oleh ASI.

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

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

Sebagai cadangan dari keputusan desain awal JavaScript, deklarasi fungsi mengalami pengangkatan lama yang sama perilaku sebagai variabel yang dideklarasikan dengan var, yang berarti bahwa deklarasi fungsi diangkat ke bagian atas cakupannya, dan dapat dipanggil sebelum dinyatakan sebagai hasil, apakah 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, fungsi deklarasi menggunakan cakupan lama JavaScript perilakunya, yang berarti deklarasi fungsi tercakup ke cakupan terdekatnya {i>function<i}:

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 dilingkupi ke blok pelampiran terdekat, seperti pada 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 variabel, pengidentifikasi yang digunakan saat mendeklarasikan fungsi akan bertindak sebagai nama simbolis untuk nilai. Mereferensikan suatu fungsi hanya dengan ID akan menampilkan objek fungsi saja, 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 mengeksekusi kode di dalam isi fungsi, panggil (atau panggil) fungsi dengan mengikuti nama fungsi menggunakan pasangan 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 dalam tanda kurung saat fungsi dipanggil adalah "arguments" (meskipun Anda mungkin melihat "argumen" digunakan untuk menggambarkan argumen dan parameter dalam beberapa ):

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 sebuah 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 lakukan inisialisasi variabel: operator penugasan (=) diikuti dengan nilai. Jika Anda menentukan argumen untuk fungsi tersebut, nilai baru itu 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 non-panah juga memiliki akses ke skrip objek arguments seperti array berisi nilai apa pun yang diteruskan sebagai argumen, baik fungsi tersebut maupun tidak menentukan parameter:

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

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

Fungsi variadik

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

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 untuk fungsi variadic ini jarang digunakan di JavaScript modern pengembangan produk. Biasanya akan menggunakan cara yang lebih modern dan mudah dibaca sintaksis parameter REST, yang membuat parameter bernama yang diinisialisasi sebagai array yang berisi argumen di luar yang telah 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 sisa 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`
``