setTimeout() fonksiyonu genelde istenen süre kadar geciktirme sağlamak amacıyla tekrar tekrar çağrılır. Ancak bu fonksiyon script ile birlikte senkron bir biçimde çalışmaz. Çağrıldığında kendi başına görevine devam ederken, scriptin geri kalan kısmının işletilmesi, fonksiyonun işini tamamlaması beklenmeden sürdürülür.
Javascriptin en çok hoşuma giden özelliklerinden biri phpde olduğu gibi değişkenlerin tipleri ile uğraştırmaması. Bir değişken tanımladığınızda o değişkene bir fonksiyonun adresi dahil istediğiniz tipte değerler atabiliyorsunuz. Bu sayede php'deki callback mantığına uygun olarak setTimeout() fonksiyonunun, scriptin geri kalan kısmı ile doğrudan senkronizasyonu sağlanamasa bile fonksiyon tamamlandığında bir script parçasının yürütülmesi sağlanabilir:
function gerisay(kactayim,bitince)
{
document.title=kactayim
if(kactayim>0) setTimeout(function(){ gerisay(--kactayim,bitince) }, 1000)
else bitince()
}
gerisay(5,function(){ alert('Bitti!') } )
Yukarıdaki örnekte fonksiyon kendisine verilen değerden sıfıra kadar sayar ve sayım bittiğinde aldığı geriçağırım(callback) parametresiyle belirtilen fonksiyonu çağırır. Rekürsif olarak çağrılan 'gerisay' fonksiyonlarından en sonuncusu hariç tümü 'bitince' parametresi için sadece taşıyıcılık görevi üstlenmiştir. Bu dolaylı rekürsif çağrı zincirinin en son halkası olan fonksiyon ise kendisine sadakatle ulaştırılan 'bitince' parametresinin işaret ettiği fonksiyonu çalıştırmak ile görevlidir. Sonuçta bu rekürsif çağrılar sonunda fonksiyonun bitimi beklenmediği için senkron biçimde yürütülemeyen kodların yer aldığı fonksiyon çağrılarak dolaylı olarak senkronizasyon sağlanmış olur...
Gereksiz olabilecek birkaç ayrıntıdan daha söz edelim. Örnekte yapılan hiçbir rekürsif çağrı bir diğeri ile senkron değildir. Çünkü başlatma çağrısı niteliğindeki ilk çağrı hariç tüm çağrılar asenkron bir fonksiyon olan setTimeout() fonksiyonu tarafından yapılmaktadır. Klasik rekürsiyon mantığına göre her çağrılan fonksiyon, kendi çağırdığı fonksiyonun bitmesini bekler ve son fonksiyon başta olmak üzere tüm fonksiyonlar sırayla sonlanır. Oysa burada setTimeout() fonksiyonunu çağıran her fonksiyon, sonuç beklemeden sonlanır. Dolayısıyla yığına fazlaca yüklenme veya yığını taşırma söz konusu değildir. Bu tam olarak rekürsiyon sayılmayabilir, bu duruma dolaylı rekürsiyon diyebiliriz...
Okunma Sayısı: 244
Yayınlanma Tarihi: 09 Haziran 2010 Çarşamba - 13:56
Anahtar Kelimeler: setTimeout(), senkron, asenkron, synchronous, call, çağrı, fonksiyonu, rekürsiyon, javascript, bitmesini beklemek
Onaylı yorum bulunmuyor.
Yorum/Görüş Bildir