"function" ifadesi ile başlayan fonksiyon tanımlamalarına fonksiyon bildirimi (Function Statement) denir.
Ancak fonksiyonlar bir değişkene veya özelliğe atanarak ya da parametre olarak gönderilirken de tanımlanabilirler. Bu şekilde tanımlamaya ise Fonksiyon İfadeler (Function Expressions) denir.
Kullanımı :
function [fonksiyonAdi]([parametre1, [parametre2, [...]]]) {
// işlemler
}
Fonksiyon ifadelerinin kullanımının fonksiyon bildirimlerinden farkı fonksiyon adının zorunlu olmamasıdır.
Örnek:
var fonksiyonum = function(a, b) {
return a * b;
};
veya
var fonksiyonum = function carpim(a, b) {
return a * b;
};
Her ikisinin de çalıştırılması şöyledir:
console.log(fonksiyonum(3, 4));
Çıktısı:
12
Ancak ikinci isimli örnekte fonksiyonu carpim(3, 4) şeklinde çağıramazsınız. Çağırmaya kalktığınızda hata ayıklayıcıda (F12);
'carpim' is undefined
('carpim' tanımsız)
şeklinde hata alırsınız. Eski bazı tarayıcılarda (IE9- gibi) her iki isim de kullanılabilir.
Fonksiyon bildirimleri ile tanımlanan fonksiyonlar tanımlandıkları yerden önce çağırılabilirler ancak fonksiyon ifadelerinin çağırılabilmesi için önce tanımlanması gerekir.
Fonksiyon bildirimi ile yapılan bu örnek çalışır:
deneme();
function deneme() {
console.log("Denem fonksiyonu çalıştı.");
}
Fonksiyon ifadesi kullanılan bu örnek hata verir.
deneme();
var deneme = function() {
console.log("Denem fonksiyonu çalıştı.");
};
Fonksiyon İfadesi Döndürme
Fonksiyon ifadeleri değer olarak döndürülebilirler. Dönen fonksiyonu kullanabilmek için ayrıca çağırmamız gerekir.
Örnek:
function islem(tur) {
if (tur == "+")
return function(a, b) { return a + b; };
else
return function(a, b) { return a - b; };
}
var islemFonksiyonu = islem("+");
// islemFonksiyonu değişkeni artık bir fonksiyon değeri içeriyor.
// Bunu normal fonksiyon olarak çalıştırabiliriz.
console.log(islemFonksiyonu(3, 5));
Çıktısı:
8
Fonksiyon İfadesini Parametre Olarak Kullanma / Gönderme:
Fonksiyon ifadeleri ve fonksiyon isimleri parametre olarak başka bir fonksiyona gönderilebilirler. Bu kullanımı iyi anlamakta fayda var. Çünkü çok sıkça kullanılan yararlı bir özelliktir. JQuery gibi bir kütüphanede veya Node.js ile programlama yaptığınızda bu durumun çok sık kullanıldığını görebilirsiniz.
Bu yöntem en sık geri çağırma (callback) fonksiyonu bildirildiği durumlarda kullanılır. Geri çağırma fonksiyonları bir fonksiyona işlevini yaparken veya genellikle bitirdiğinde çalıştıracağı bir fonksiyon tanımı göndermek için kullanılır. Daha çok eşzamanlı olmayan durumlarda kullanılırlar. Örneğin eşzamanlı olmayan (cevabı ne zaman geleceği bilinmeyen) bir AJAX çağrısı tamamlandığında yapılacak olan işi bir fonksiyon parametre olarak bildirebilirsiniz.
Örnek:
var toplama = function (toplanan1, toplanan2) {
return toplanan1 + toplanan2;
};
// Sonda bir ; olduğuna dikkat edin. Bunu koymasanız da çalışır.
// Ama normalde bu bir tanım değil ifade olduğundan koymak gerekir.
var carpma = function (carpilan1, carpilan2) {
return carpilan1 * carpilan2;
};
function hesapla(sayi1, sayi2, islemFonksiyonu) {
var sonuc = islemFonksiyonu(sayi1, sayi2);
return sonuc;
}
var toplam = hesapla(3, 4, toplama); // Fonksiyon isminin yanında () kullanılmadığına dikkat edin.
var carpim = hesapla(3, 4, carpma);
console.log(toplam);
console.log(carpim);
Çıktısı:
7
12
veya
function toplama(toplanan1, toplanan2) {
return toplanan1 + toplanan2;
}
function carpma(carpilan1, carpilan2) {
return carpilan1 * carpilan2;
}
function hesapla(sayi1, sayi2, islemFonksiyonu) {
var sonuc = islemFonksiyonu(sayi1, sayi2);
return sonuc;
}
var toplam = hesapla(3, 4, toplama);
var carpim = hesapla(3, 4, carpma);
console.log(toplam);
console.log(carpim);
Çıktısı:
7
12
Aynı örneği şu şekilde de yazabiliriz:
function hesapla(sayi1, sayi2, islemFonksiyonu) {
var sonuc = islemFonksiyonu(sayi1, sayi2);
return sonuc;
}
var toplam = hesapla(3, 4, function(toplanan1, toplanan2) {
return toplanan1 + toplanan2;
});
var carpim = hesapla(3, 4, function(carpilan1, carpilan2) {
return carpilan1 + carpilan2;
});
Örnekte görüldüğü gibi hesapla fonksiyonuna üçüncü parametre olarak komple bir fonksiyon tanımı gönderilmiştir.
Fonksiyonların parametre olarak sıkça kullanıldığı yerlerden birisi setTimeout veya setInterval ile zamanlayıcı kurma çağrısıdır. Bu fonksiyonlarda iki parametre vardır. Birincisi belirtilen zaman sonra (setTimeout) veya belirtilen zaman aralığında (setInterval) hangi fonksiyonun çalıştırılacağı, ikincisi ise milisaniye cinsinden bekleme süresidir.
Örnek:
setInterval(function() { console.log("Çalıştı"); }, 1000);
Fonksiyon ifadesi olmadan şu şekilde kullanılabilir:
function zamanlama() {
console.log("Çalıştı");
}
setInterval(zamanlama, 1000);
Bu örnek saniyede bir birinci parametre olarak verilen fonksiyonu çalıştırıp günlüğe (log) Çalıştı metnini yazar.
JQuery İle Basit Bir AJAX callback Örneği:
$.get("ajaxSayfam.html",
function( gelenVeri ) {
console.log("Gelen veri:" + gelenVeri);
});
Bu kullanımda $.get fonksiyonuna gönderilen ikinci parametre komple bir fonksiyon ifadesidir ve bir callback'dir (get fonksiyonu işini yaparken bir ara veya en sonda çalıştıracak). Buradaki AJAX get çağrısı varsayılan olarak eşzamanlı olmadığından (çağrı yapıldıktan sonra yanıtın ne zaman geleceği bilinmediğinden), parametre olarak bildirilen bu fonksiyon isteğe cevap geldikten sonra çalıştırılacaktır. Çağrıyı yapan get fonksiyonu, cevap geldiğinde gelen veriyi parametre olarak kullanılan data değişkenine atayacaktır. Fonksiyon çalıştırıldığında gelen veri (data parametresinin değeri) "Gelen veri:" etiketiyle beraber görülecektir.
Bu örneğin aynısını fonksiyon ifadesi kullanmadan şu şekilde yazabiliriz:
function veriGeldi(gelenVeri) {
console.log("Gelen veri:" + gelenVeri);
}
$.get("ajaxSayfam.html", veriGeldi);
JavaScript Fonksiyonları ile İlgili Makaleler: