Mövzunu Açan
#0
Callback Fonksiyonları Nasıl Çalışır?
Bir yazılımcı olarak yolculuğumuzda sıkça karşılaştığımız, hatta belki de farkında bile olmadan kullandığımız ama derinlemesine anlamanın çoğu zaman atlandığı konulardan biri callback fonksiyonlarıdır. Özellikle modern web geliştirme dünyasında, JavaScript'in kalbinde atar desek abartmış olmayız. Peki, bu "geri çağırma" fonksiyonları tam olarak nedir ve arkasındaki mantık nasıl işler? Gelin, bu kavramın perde arkasına birlikte bakalım, hem teorik hem de pratik örneklerle konuyu netleştirelim.
En temel tanımıyla, bir callback fonksiyonu, başka bir fonksiyona argüman olarak geçilen ve ana fonksiyonun işini bitirdikten sonra ya da belirli bir olay gerçekleştiğinde çalıştırılmak üzere tasarlanmış bir fonksiyondur. Kulağa biraz karmaşık geliyor olabilir ama aslında günlük hayattan çok basit bir analojiyle açıklayabiliriz: Bir arkadaşınıza "Şu işi bitirince beni ara" demek gibi... Burada "beni ara" eylemi, arkadaşınızın işi bittikten sonra tetiklenecek olan bir callback'dir. Siz işin ne zaman biteceğini bilmiyorsunuz ama bittiğinde bir aksiyon almasını bekliyorsunuz. Yazılımda da durum çok farklı değil.
Peki, neden böyle bir yapıya ihtiyaç duyarız? Ana sebep, işlemlerin asenkron doğasıdır. Bilgisayar programları genellikle yukarıdan aşağıya, adım adım çalışır. Bu senkron bir akıştır. Ancak bazı işlemler, örneğin bir sunucudan veri çekmek, bir dosya okumak veya bir kullanıcının bir butona tıklamasını beklemek gibi, anında sonuç vermez. Bu işlemler zaman alır ve biz bu sürede programımızın donmasını, kilitlenmesini istemeyiz. İşte burada callback'ler devreye girer. Asenkron bir işlem başlattığınızda, ona bir callback verirsiniz ve dersiniz ki: "Sen işini yap, ben bu sırada başka şeylerle ilgileneyim. İşin bitince, lütfen bu callback fonksiyonunu çalıştır ve bana sonucu bildir." Bu, programın akışını kesintiye uğratmadan, eş zamanlı gibi görünen farklı görevleri yönetmemizi sağlar.
Callback'lerin kullanım alanlarına baktığımızda, genellikle üç ana kategoride karşımıza çıkarlar:
Şimdi gelin, bu kavramı biraz daha somutlaştıralım ve basit JavaScript örnekleriyle nasıl çalıştığını görelim. JavaScript, callback'lerin en sık kullanıldığı dillerden biridir ve bu konuyu anlamak için harika bir başlangıç noktasıdır.
Örnek 1: Basit Bir Asenkron İşlem - setTimeout
Bu kodu çalıştırdığınızda çıktıyı nasıl beklersiniz? "Merhaba!" ve "Güle güle!" hemen ekrana basılırken, "2 saniye sonra göründüm." ifadesi iki saniyelik bir gecikmeyle ortaya çıkar. İşte buradaki
Örnek 2: Olay Dinleyicileri (Event Listeners)
Web geliştiriciliğinde olmazsa olmazdır. Bir kullanıcı bir butona tıkladığında ne olacağını belirlemek için kullanırız.
Burada `function
Bir yazılımcı olarak yolculuğumuzda sıkça karşılaştığımız, hatta belki de farkında bile olmadan kullandığımız ama derinlemesine anlamanın çoğu zaman atlandığı konulardan biri callback fonksiyonlarıdır. Özellikle modern web geliştirme dünyasında, JavaScript'in kalbinde atar desek abartmış olmayız. Peki, bu "geri çağırma" fonksiyonları tam olarak nedir ve arkasındaki mantık nasıl işler? Gelin, bu kavramın perde arkasına birlikte bakalım, hem teorik hem de pratik örneklerle konuyu netleştirelim.
En temel tanımıyla, bir callback fonksiyonu, başka bir fonksiyona argüman olarak geçilen ve ana fonksiyonun işini bitirdikten sonra ya da belirli bir olay gerçekleştiğinde çalıştırılmak üzere tasarlanmış bir fonksiyondur. Kulağa biraz karmaşık geliyor olabilir ama aslında günlük hayattan çok basit bir analojiyle açıklayabiliriz: Bir arkadaşınıza "Şu işi bitirince beni ara" demek gibi... Burada "beni ara" eylemi, arkadaşınızın işi bittikten sonra tetiklenecek olan bir callback'dir. Siz işin ne zaman biteceğini bilmiyorsunuz ama bittiğinde bir aksiyon almasını bekliyorsunuz. Yazılımda da durum çok farklı değil.
Peki, neden böyle bir yapıya ihtiyaç duyarız? Ana sebep, işlemlerin asenkron doğasıdır. Bilgisayar programları genellikle yukarıdan aşağıya, adım adım çalışır. Bu senkron bir akıştır. Ancak bazı işlemler, örneğin bir sunucudan veri çekmek, bir dosya okumak veya bir kullanıcının bir butona tıklamasını beklemek gibi, anında sonuç vermez. Bu işlemler zaman alır ve biz bu sürede programımızın donmasını, kilitlenmesini istemeyiz. İşte burada callback'ler devreye girer. Asenkron bir işlem başlattığınızda, ona bir callback verirsiniz ve dersiniz ki: "Sen işini yap, ben bu sırada başka şeylerle ilgileneyim. İşin bitince, lütfen bu callback fonksiyonunu çalıştır ve bana sonucu bildir." Bu, programın akışını kesintiye uğratmadan, eş zamanlı gibi görünen farklı görevleri yönetmemizi sağlar.
Callback'lerin kullanım alanlarına baktığımızda, genellikle üç ana kategoride karşımıza çıkarlar:
- Asenkron İşlemler: En yaygın kullanım alanı burasıdır. Bir API çağrısı yaptığınızda, bir veritabanı sorgusu başlattığınızda veya bir zamanlayıcı ayarladığınızda (örneğin JavaScript'teki ), işlemin ne zaman biteceği belirsizdir. Callback'ler, bu belirsizlik anında programın diğer kısımlarının çalışmaya devam etmesini sağlar. İşlem tamamlandığında, callback tetiklenir ve sonuçla birlikte gereken aksiyon alınır.CODE
1
setTimeout
- Olay Yönetimi (Event Handling): Kullanıcı etkileşimleri (tıklamalar, klavye girişleri, fare hareketleri) asenkron olaylardır. Bir butona tıklandığında ne olacağını belirlemek için, butona bir "tıklama olayı dinleyicisi" ekleriz ve bu dinleyiciye bir callback fonksiyonu veririz. Kullanıcı butona tıkladığında, tarayıcı bu callback'i çalıştırır. Örneğin, yapısındakiCODE
1
element.addEventListener('click', myFunction);bir callback'tir.CODE1
myFunction
- Genel Amaçlı Fonksiyonlar ve Modülerlik: Callback'ler, bir fonksiyonun davranışını dışarıdan parametrelerle dinamik olarak değiştirmemizi sağlar. Örneğin, bir dizi üzerinde işlem yapan genel bir fonksiyon yazabiliriz ve bu fonksiyona dizinin her elemanı için uygulanacak özel bir callback verebiliriz. JavaScript'teki ,CODE
1
Array.prototype.map()veyaCODE1
filter()gibi yöntemler buna harika örneklerdir. Bu sayede kodumuz daha esnek, tekrar kullanılabilir ve modüler hale gelir.CODE1
forEach()
Şimdi gelin, bu kavramı biraz daha somutlaştıralım ve basit JavaScript örnekleriyle nasıl çalıştığını görelim. JavaScript, callback'lerin en sık kullanıldığı dillerden biridir ve bu konuyu anlamak için harika bir başlangıç noktasıdır.
Örnek 1: Basit Bir Asenkron İşlem - setTimeout
CODE
123456789
console.log("Merhaba!");
// 2 saniye sonra çalışacak bir callback fonksiyonu
setTimeout(function() {
console.log("2 saniye sonra göründüm.");
}, 2000);
console.log("Güle güle!");
Bu kodu çalıştırdığınızda çıktıyı nasıl beklersiniz? "Merhaba!" ve "Güle güle!" hemen ekrana basılırken, "2 saniye sonra göründüm." ifadesi iki saniyelik bir gecikmeyle ortaya çıkar. İşte buradaki
function() { console.log("2 saniye sonra göründüm."); } ifadesi bir callback fonksiyonudur. setTimeout fonksiyonuna argüman olarak verilmiş, setTimeout kendi işini (zamanlayıcıyı kurma) bitirmiş ve 2000 milisaniye (2 saniye) sonra bu callback'i çağırmıştır. Bu sırada program akışı durmamış, "Güle güle!" mesajı hemen işlenmiştir. Bu, asenkronluğun ve callback'lerin temel gücünü gösterir.Örnek 2: Olay Dinleyicileri (Event Listeners)
Web geliştiriciliğinde olmazsa olmazdır. Bir kullanıcı bir butona tıkladığında ne olacağını belirlemek için kullanırız.
CODE
12345678910
// HTML'de id'si "myButton" olan bir butonumuz olduğunu varsayalım
const button = document.getElementById('myButton');
// Butona tıklandığında çalışacak bir callback fonksiyonu ekliyoruz
button.addEventListener('click', function() {
alert('Butona tıklandı!');
});
console.log("Olay dinleyici ayarlandı.");
Burada `function