Kendini çağıran fonksiyon anlamına gelir. İç-içe derinlikli menü sistemlerinde, forum / bulletin tarzı
sistemlerde kullandığımız bir işlemdir. Obje konusu işlerken, key : value durumundan bahsetmiştik. Obje içinde
duran elemanlar, key : value şeklinde bulunurlar, hatta bazen value’da bir obje olabilirdi!
- var myObject = {
- 'key' : {
- 'key' : {
- 'key' : {
- 'key' : "value"
- }
- }
- }
- }
value’ye erişmek için;
- var mVal = myObject[ 'key' ][ 'key' ][ 'key' ][ 'key' ];
yapmak gerekecekti. Çünki obje içindeki value de bir obje olabiliyordu.
Şimdi iç içe derinliği olan bir ürünler listesi yapalım. Amacımız tek harkette bunu ekrana basmak.
- var Menu = {
- 'Ev Eşyaları' : {
- 'Beyaz Eşya' : {
- 'Arçelik' : ""
- ,'Beko' : ""
- }
- ,
- 'Mobilya' : {
- 'Oturma Grubu' : {
- 'Bellona' : ""
- ,'Çilek' : ""
- }
- }
- }
- ,
- 'Elektronik' : {
- 'Bilgisayar' : {
- 'HP' : ""
- ,'Dell' : ""
- ,'Acer' : ""
- }
- ,
- 'Televizyon' : {
- 'Toshiba' : {
- 'LCD' : ""
- ,'Plazma' : ""
- }
- ,
- 'Sony' : ""
- }
- }
- };
5.satırdaki Beko, aslında, Ev Eşyaları ana kategorisinden, Beyaz Eşya’ya ait.
Eğer biz Menu[ 'Ev Eşyaları' ] istesek bize value olarak bir obje dönecek. bunun içirisinde dolaştığımız zaman;
key’i Beyaz Eşya olanın value’su de yine bir obje olacak. Yani sonuçta biz,
Beko’a ulaşmak için iç-içe 2-3 tane forin döngüsü yapmak zorunda kalıcaz.
İşin kötü yanı, diğer ürünlerdeki derinlik farklı olabilir. Yani birinde 3 tane forin yaparken, başka bir ürün grubu
için belki 5 tane loop yapmak gerekebilir.
Bunun için Recursive işlem yapmamız gerekiyor. Böylece derinlik adedinden bağımsız işlem yapabiliriz.
- function print_menu( objObject , strDeep )
- {
- for( var key in objObject )
- {
- document.write( '<p>' + strDeep + key + '<\/p>' );
- if( typeof( objObject[ key ] ) == 'object' )
- {
- print_menu( objObject[ key ] , strDeep+'>>' );
- }
- }
- }
-
- print_menu( Menu , '' );
print_menu fonksiyonuna ilk çağrılışta içinde dolaşacağımız objeyi ( Menu ) ve ilk derinliği ( '' ) parametre olarak geçeriz.
Fonksiyona aşağıdaki aşamalardan geçerek çalışır:
- İlk key gelir. Bu : Ev Eşyalarıdır.
- Derinlik bilgisi olarak geçilen strDeep’in değeri boştur. ( Yani '' )
- <p> içine : BOŞ STRING ve Ev Eşyaları yazılır.
- Value’ya bakılır, o an için value : objObject[ key ] yani Menu[ 'Ev Eşyaları' ]’dan gelen değerdir.
- Eğer o değer bir obje ise fonksiyon kendini çağırır. 2 parametre geçmesi gerekir, ilk parametre obje olmalı yani objObject[ key ] ( Menu[ 'Ev Eşyaları' ] ), ikinci parametre olarak derinlik. O an için BOŞ olan yani '' olana ( strDeep ) >> ekliyerek geçer.
- Yani şuanda sakni print_menu( Menu , '' ); yerine, print_menu( Menu[ 'Ev Eşyaları' ] , '>>' ); demiş oluruz.
- 1.satırdaki key artık Beyaz Eşya olur.
- 2.satırdaki Derinlik bilgisi de >> olur.
- 3.satır yine <p> içine : >> ve Beyaz Eşya yazar.
- 4.satır aynı kontrolü yapar ve bu iş tüm key/value çifti bitene kadar sürer.
Derste yaptığımız detaylı örnek için tıklayın.