İşlevler

İşlev, işleve sağlanan bağımsız değişkenlere dayalı olarak bir değeri hesaplama ve döndürme gibi bir dizi ilgili görevi gerçekleştirmek için kullanılan modüler, yeniden kullanılabilir bir ifade bloğudur. Tüm temel olmayan değerlerde olduğu gibi işlevler de nesnedir. Bunlar; kodu yürütmek, verileri bağımsız değişken biçiminde iletmek ve bir değer return için çağrılabildikleri benzersiz nesnelerdir.

İşlevler "birinci sınıf" nesneler olarak düşünülür. Diğer bir deyişle, benzersiz davranışlarına rağmen, diğer herhangi bir JavaScript nesnesiyle tamamen aynı bağlamlarda kullanılabilirler. Örneğin, bir işlev bir değişkene atanabilir, diğer işlevlere bağımsız değişken olarak geçirilebilir ve diğer işlevler tarafından döndürülebilir.

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

Bir nesnenin özelliği olarak tanımlanan bir işleve genellikle "yöntem" denir. var kullanılarak tanımlanan değişkenlerde olduğu gibi, çevreleyen bir işlevin dışında yapılan işlev bildirimleri global nesneye yöntem olarak eklenir.

İşlev bildirimleri

İşlev bildirimi ("işlev ifadesi" veya "işlev tanımı" olarak da adlandırılır), kapsayıcı kapsamının başka bir yerinde çağrılabilecek adlandırılmış bir işlev oluşturur. İşlev bildirimleri, function anahtar kelimesi ve ardından bir tanımlayıcı, parantez içine alınmış virgülle ayrılmış parametre listesi ve "işlev gövdesi" adlı bir blok ifadesinden oluşur. Sık sık noktalı virgülle bitmeyen işlev bildirimleriyle karşılaşırsınız. İşlev bildirimi ifade olduğundan, sondaki noktalı virgüller ASI tarafından tahmin edilebilir.

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

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

JavaScript'in ilk tasarım kararlarının bir parçası olarak işlev bildirimleri, var ile tanımlanan değişkenlerle aynı eski kaldırma davranışına tabidir. Diğer bir deyişle, işlev bildirimi, kapsamın en üst kısmına yükseltilir ve bir sonuç olarak, söz konusu kapsamın katı mod tarafından yönetilip yönetilmediğine bakılmaksızın, bildirimden önce çağrılabilir:

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

Katı modun dışında, işlev bildirimlerinde JavaScript'in eski kapsam oluşturma davranışı kullanılır. Diğer bir deyişle, bir işlev bildirimi en yakın ilgili işlevin kapsamına alınır:

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

Yüksek düzey modunda, işlev bildirimleri let veya const kullanılarak tanımlanan değişkenlerde olduğu gibi en yakın çevreleyen bloka ayarlanır:

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

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

İşlev çağrısı

Değişkenlerde olduğu gibi, bir işlev tanımlarken kullanılan tanımlayıcı bir değer için sembolik ad görevi görür. Bir işleve tek başına tanımlayıcıyla referans vermek yalnızca işlev nesnesini döndürür ve içerdiği işlevi yürütmez:

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

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

İşlev gövdesinin içindeki kodu yürütmek için, işlev adından sonra eşleşen bir parantez çifti ekleyerek işlevi çağrı yapın (veya çağrı yapın):

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

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

İşlev tanımındaki parametreler, işlev çağrıldığında işlev gövdesine geçirilebilecek değerler için yer tutucu değişkenleri olarak görev yapar. Bir işlev çağrıldığında parantez içindeki değerler "bağımsız değişkenler"dir (ancak bazı belgelerde hem bağımsız değişkenleri hem de parametreleri tanımlamak için "bağımsız değişkenler"in kullanıldığını görebilirsiniz):

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

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

Beklenen bir bağımsız değişken atlanırsa sonuç parametresi bir undefined değeri içerir. Bunun nedeni, parametrenin işlev gövdesine bildirilmesi ancak bir değerle başlatılmamasıdır:

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

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

Varsayılan parametre değerlerini, bir değişkeni başlatırken yaptığınız gibi ilk kullanıma hazırlayarak belirleyebilirsiniz: Atama operatörü (=) ve ardından bir değer gelir. Daha sonra söz konusu işlev için bir bağımsız değişken belirtirseniz bu yeni değer, varsayılan değeri geçersiz kılar:

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

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

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

Ok olmayan işlevin gövdesi, işlev tanımının parametreleri belirtip belirtmediğine bakılmaksızın, bağımsız değişken olarak iletilen değerleri içeren, sıfır dizinli, dizi benzeri bir arguments nesnesine de erişebilir.

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

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

Değişken fonksiyonlar

arguments nesnesi, değişken sayıda bağımsız değişkeni kabul edebilen temel değişken işlevler oluşturmanızı sağlar:

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

Bununla birlikte, çeşitli işlevlere yönelik bu yaklaşım, modern JavaScript geliştirmesinde nadiren kullanılır. Daha modern ve okunabilir rest parametresi söz dizimi daha yaygındır. Bu parametre, açıkça belirtilenlerin ötesinde herhangi bir bağımsız değişken içeren bir dizi olarak başlatılan adlandırılmış bir parametre oluşturur:

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 bağlamasından farklı olarak, geri kalan parametre söz dizimi, ok işlevi parametreleriyle beklendiği gibi çalışır:

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

myOuterFunction( false );
> true

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

myArrowFunction( true );
> true`
``