Merhaba, JavaScriptte bir takım işlemleri gerçekleştirebilmemiz için bize sunulmuş fonksiyonlar bulunmaktadır. Bu fonksiyonları matematiksel fonksiyonlar, metin fonksiyonları, tarih fonksiyonları ve kullanıcı tanımlı fonksiyonlar olarak ayıracağız. 

Kullanıcı Tanımlı Fonksiyonlar

Scriptimiz içerisinde bazı işlemleri tekrarlı bir şekilde kullanmamız gerekebilir. Böyle bir ihtiyacımızda ilgili işlemi her kullanacağımız alan için tekrar yazmak yerine bir fonksiyona tanımlayıp gerektiğinde bu fonksiyonu çağırmak işimizi oldukça kolaylaştırır. 

function fonksiyonAdi{
 // fonksiyonun yapacağı işlemler
}

Bir fonksiyon tanımlamak için önce function yazıyoruz. Bunu fonksiyonu kullanırken değil yalnızca tanımlarken kullanacağız. Daha sonra fonksiyonumuza vereceğimiz adı belirliyoruz. Bu ad aynı değişken isimlerinde olduğu gibi belirli kurallar çerçevesinde verilmelidir. Özel karakterler, boşluk veya tırnak işaretleri kullanılamaz. 

<!DOCTYPE html>
<html>
<body>
<script>
function selamver(){
  alert('Merhaba');
}

selamver();
</script>
</body>
</html>

Burada çok basit bir fonksiyon tanımladık. Fonksiyonumuzun adı selamver ve bu fonksiyon çağırıldığında yapılacak işlem ekrana mesaj kutusunda Merhaba yazmak. Fonksiyonumuzun tanımlaması burada bitti.

Daha sonra selamver();diyerek fonksiyonun sayfa açılışı ile birlikte çalışmasını sağladık. Sayfayı çalıştırdığımızda ekranımıza artık mesaj kutusunda Merhaba yazacak.

Şimdi de parametreli bir uygulama yapalım:

<!DOCTYPE html>
<html>
<body>
<script>
function mesaj(x){
  document.write(x);
}

mesaj(prompt());
</script>
</body>
</html>

Burada önce mesaj adında bir fonksiyon tanımladık. Fonksiyon ismimizi tanımlarken parantez içerisine de bir değişken yerleştirdik. Daha sonra fonksiyonumuzun işlem kısmında da ekrana bu değişkenin içeriğinin yazdırılmasını söyledik. Son olarak fonksiyonumuzu çağırdık ve değişken alanına da prompt() yani mesaj giriş kutusunun değeri olarak belirledik.

Böylece sayfamızı açtığımızda mesaj fonksiyonumuzu çağırdığımız için ve mesaj fonksiyonumuz da değerini mesaj giriş kutusundan alacağı için karşımıza mesaj giriş kutusu çıkacak. Daha sonra buraya yazacağımız mesaj, fonksiyonun işlevi gereği ekrana yazdırılacak.

Fonksiyonu Düğme ile Çalıştırma

Yaptığımız örneklerde fonksiyonu sayfanın açılmasıyla otomatik çalışacak şekilde ayarladık. Şimdi de parametreli bir fonksiyonu bir düğmeye tıklanması durumunda çalıştıralım. Bunun için bir düğme oluşturup HTML’in sağladığı onclick(tıklanınca) özelliğini kullanacağız.

<!DOCTYPE html>
<html>
<head>
<title>Faktöriyel Bulma</title>
</head>
<body>
<input type="button" value="Tıkla" onclick="return dugmeFonksiyonu()" />
<script>
function dugmeFonksiyonu(){
  var hesapla=faktorbul(prompt("Faktoriyeli bulunacak sayıyı yazın:"));
  document.write(hesapla);    
}

function faktorbul(sayi){
  var sonuc=1;
    
    for(var i=1;i<=sayi;i++){
    	sonuc=sonuc*i;
    }
    
    return sonuc;
}
</script>
</body>
</html>

Burada faktoriyel bulma uygulaması yaptık. Öncelikle bir düğme oluşturduk ve düğmeye tıklayınca dugmeFonksiyonuadını verdiğimiz fonksiyonun çalıştırılmasını söyledik. Daha sonra scriptimizi yazmaya başladık.

İlk önce düğme ile çağırdığımız dugmeFonksiyonu’nu oluşturduk. Burada hesapla adında bir değişken oluşturduk ve bu değişkenimizin değerini document.write ile ekrana yazılmasını söyledik. hesapla değişkenimizin değeri ise bir başka fonksiyon olan faktorbul adındaki parametreli fonksiyonumuz. Buradaki parametreyi de prompt() aracılığı ile girilmesini istedik. Öyle ise, düğmeye tıklandığında bir prompt penceresi açılacak ve bizden bir sayı girmemizi isteyecek. Ve bu sayıyı faktorbul fonksiyonumuz içerisinde kullanacak. Şimdi de faktorbul fonksiyonumuza bakalım.

faktorbul fonksiyonumuz parameterli bir fonksiyon ve verilen değerin faktoriyelini bulmaya yarıyor. Faktoriyel hesabı bir sayının 1’den başlayarak kendine kadar olan sayıların çarpımıdır. Örnek olarak 4 faktöriyel: 4! = 1x2x3x4 işlemidir. Değeri 24’tür. 

0 faktoriyelin değeri 1 olduğu için ilk olarak sonuc değişkenimizin değerine 1 veriyoruz. Daha sonra ard arda çarpma işlemi yapacağımız için bir for döngüsü kullanmamız gerekiyor. Burada başlangıç sayımız faktoriyel hesabına göre 1 ve bitiş sayımız da fonksiyonumuza gönderilen faktoriyelini bulmak istediğimiz sayıdır. Artış miktarı da yine faktoriyel hesabına göre 1 olmalıdır. Daha sonra sonuc değişkenimizi 1 artırıp döngü içerisinde kendisiyle çarpıyoruz. Buna göre 4 faktoriyeli hesaplamak için döngü sırasıyla:

  • sonuc = 1×1; (baştaki 1 sonuc değişkenin ilk değeri olan 1, sondaki 1 i’den geliyor ve döngü sonrası 1 artırılıyor)
  • sonuc = 1×2; (baştaki 1 sonuc değişkenimiz önceki döngüdeki sonuca göre hala 1 olduğu için 1, sondaki i’nin 1 artırılmış durumu olarak 2)
  • sonuc = 2×3; (baştaki 2 sonuc değişkenimizin bir önceki döngüde almış olduğu değer olan 2, sondaki i’nin 1 artırılmış durumu olan 3)
  • sonuc = 6×4; (baştaki 6 sonuc değişkenimizin bir önceki döngüde almış olduğu değer lan 6, sondaki i’nin 1 artırılmış ve döngüyü bitiren değeri olan 4)

Ve döngümüz bittiği için sonuc değişkenimizin değeri 24 oldu. Şimdi bulunan bu değer dugmeFonksiyonu gereği ekrana yazdırılacak. faktorbul fonksiyonumuzun sonunda return komutunu görüyoruz. Bu komut fonksiyonda elde edilen sonucun aktarılmasını sağlıyor. Fonksiyonda elde edilen değeri aktarmazsak fonksiyonun yaptığı işlem bir işimize yaramazdı.

Rekürsif Fonksiyonlar

Fonksiyonların kendi kendilerini içerisinde kullanmaları durumuna rekürsif (özyinelemeli) fonksiyonlar denir. 

function rekursif() {
    // ...
    rekursif();
    // ...
}

Rekürsif fonksiyonlarda kendini çağırmayı durdurması gereken bir nokta olmak zorundadır. Aksi takdirde sonsuz bir döngü içerisinde kendisini çağırmaya devam eder. 

function rekursif() {
    if(kosul) {
        // kendini çağırmayı durdur
        //...
    } else {
        rekursif();
    }
}

Burada kendisini çağırmayı durdurmasını bir koşula bağlamış olduk. Bir de yazılan değere kadar olan tüm sayıları toplayan bir uygulama yapalım:

function ekle(sayi) {
    if (sayi > 1)
        return sayi + ekle(sayi - 1);
    return sayi;
}
 
document.write(ekle(4));

Örneğimizin aşamalarını inceleyelim:

  • document.write(ekle(4)); komutu ile fonksiyonumuza 4 değeri vererek çağırmış olduk.
  • Sayımız 4 olarak fonksiyonun için girer, 1’den büyük olma koşulunu sağladığı için 4 + ekle(4-1) fonksiyonundan dönen değerle toplanır. Fakat ilk çalıştırma öncesinde fonksiyondan dönen bir değer (ekle(3) ‘ün değeri) olmadığı için sayi değeri 4 olarak kalır ve bir toplama yapılmaz.
  • İkinci çalıştırmada sayi değerimiz 3 olarak girer ve bu çalıştırmada da ekle(2)’nin değerine ihtiyaç duyar ve dolayısı ile sayi değeri yine 3 olarak kalır.
  • Üçüncü çalıştırmada sayi değerimiz 2 olarak girer ve bu çalıştırmada da ekle(1)’in değerine ihtiyaç vardır ve bu da elimizde olmadığı için sayi değeri 2 olarak kalir.
  • Dördüncü çalıştırmada sayi değerimiz 1 olarak girer. Bu sefer fonksiyon içerisindeki sayi > 1 koşulunu sağlamadığı için if atlanır ve fonksiyon bize sayi değişkenimizi verir. Yani bu durumda ekle(1) fonksiyonumuz bize 1 sonucunu verecektir.
  • Üçüncü çalıştırmada ihtiyacımız olan ekle(1)’i elde ettiğimize göre fonksiyon ekle(2)’nin değerini elde edebiliyoruz, buna göre 2+1’den ekle(2) fonksiyonumuzun sonucu 3 değerini verir.
  • İkinci çalıştırmada ihtiyacımız olan ekle(2)’yi elde ettiğimize göre ekle(3) fonksiyonumuzun değerini elde edebiliyoruz, buna göre sayımız 3, ekle(sayi-1) yani ekle(2) fonksiyonumuzun değeri 3, 3+3’den ekle(3) fonksiyonumuz 6 değerini verir.
  • İlk çalıştırmada ekle(4) yani asıl ulaşmak istediğimiz fonksiyonda ihtiyacımız olan ekle(3) değerine de sahip olduğumuza göre 4  + 6 ‘dan 10 sonucunu verir.
  • Fonksiyonun yapması gereken başka bir çağrı kalmadığı için de çalışmayı durdurur ve ekrana sonucu yazar.

Burada bir döngü olmadığı için sayının sürekli 1 eksiltilerek fonksiyona tekrar girmesi fonksiyon içerisinde kendisini içeriye giren değerin 1 eksiğiyle tekrar çağırmasından kaynaklıdır. Her bir çağrıda fonksiyon tekrar çalışır ve bir sonuç elde edene kadar ve içerideki kendini çağırma koşulu sağlandığı sürece çalışmaya devam edecektir.