folder Tahribat.com Forumları
linefolder Html - CSS - XML - JavaScript - Ajax
linefolder Javascript Basit Görünen Beyin Yakan Sorular



Javascript Basit Görünen Beyin Yakan Sorular

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    makets
    makets's avatar
    Kayıt Tarihi: 17/Ocak/2010
    Erkek

    evet beyler harikulade cevaplar var. Sanırım doğru anladıysam  4) ve 5) te yanlış giden birşeyler var. Sıfırdan console açıp Chrome da denediğimde 2 sonucunu alıyorum ama js.do da denedim şimdi undefined veriyor. Aslına bakılırsa 4) ve 5) undefined output unu verdiğinden emin olunca aklımdaki tüm çelişkiler giderilmiş oldu. Çünkü compiler var a; yi hoisting ediyor. Engine,  executing fazindayken ve a console.log çalışırken Right Handle Side(RHS) a=2; assignmentini mecvut scopta console.log satırından yukarıda arıyor ve yukarıda sadece declarated edilmiş ama assignment edilmemiş şekilde gördüğü için a nin ilk değeri olan undefined i output olarak veriyor. Tabi doğru anladıysam :)

    cevaplarınız için ayrı ayrı teşekkürler. Konu aklımda oturmaya başladı. 

     

    makets tarafından 05/Kas/17 21:47 tarihinde düzenlenmiştir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    makets bunu yazdı

    evet beyler harikulade cevaplar var. Sanırım doğru anladıysam  4) ve 5) te yanlış giden birşeyler var. Sıfırdan console açıp Chrome da denediğimde 2 sonucunu alıyorum ama js.do da denedim şimdi undefined veriyor. Aslına bakılırsa 4) ve 5) undefined output unu verdiğinden emin olunca aklımdaki tüm çelişkiler giderilmiş oldu. Çünkü compiler var a; yi hoisting ediyor. Engine,  executing fazindayken ve a console.log çalışırken Right Handle Side(RHS) a=2; assignmentini mecvut scopta console.log satırından yukarıda arıyor ve yukarıda sadece declarated edilmiş ama assignment edilmemiş şekilde gördüğü için a nin ilk değeri olan undefined i output olarak veriyor. Tabi doğru anladıysam :)

    cevaplarınız için ayrı ayrı teşekkürler. Konu aklımda oturmaya başladı. 

     

    Ben dediklerimi unuttum hocam. Doğru gibi de compiler araya kaynamış :)

    Kodun en başında "use strict" ya da 'use strict' yazınca bu gibi konularda kafa yormaya pek gerek kalmıyor:)

     

    YeniHarman tarafından 05/Kas/17 22:33 tarihinde düzenlenmiştir

    Olaylara karışmayın!
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Ah ah ne çektim şunlardan.. Bazen farkına varmadan aynı isimle 2 fonksiyon yazıyorum. Hata yok bir şey yok. Al başına belayı :D 


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    makets
    makets's avatar
    Kayıt Tarihi: 17/Ocak/2010
    Erkek

    onca kurcalayistan sonra en iyisi YeniHarman hocamin da dediği gibi global scopeta 'use strict' basıp geçeyim kafam rahat. 

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    makets
    makets's avatar
    Kayıt Tarihi: 17/Ocak/2010
    Erkek

    beyin yakan sorularıma vol2 olarak devam ediyorum hocalar. Alttaki kodları yine sırasıyla nasıl output verdiğini açıklayacak babayiğitler arıyorum. Js baya bi karışıkmış.

    1)

    for (var i=1; i<=5; i++) {
    	setTimeout( function timer(){
    		console.log( i );
    	}, i*1000 );
    }

    Burada çıktı geçen her bir saniyede ekrana 6 rakamını yazdırıyor.  Ekranda toplam 5 adet 6 rakamı yazıyor.

     

    2)

    for (var i=1; i<=5; i++) {
    	setTimeout( function timer(){
    		console.log( i );
    	}, 1000 );
    }

    Burada bir sniye geçtikten sonra ekrana 66666 rakamlarının hepsini aynı anda yazdırıyor

    3)

    for (var i=1; i<=5; i++) {
    	(function(){
    		setTimeout( function timer(){
    			console.log( i );
    		}, i*1000 );
    	})();
    }

    Burada 1) ile aynı output veriyor

     

    4)

    for (var i=1; i<=5; i++) {
    	(function(){
    		var j = i;
    		setTimeout( function timer(){
    			console.log( j );
    		}, j*1000 );
    	})();
    }

    Burada geçen her bir saniyede sırasıyla ekrana 1, 2, 3, 4, 5 şeklinde output veriyor

     

    5)

    for (var i=1; i<=5; i++) {
    	(function(j){
    		setTimeout( function timer(){
    			console.log( j );
    		}, j*1000 );
    	})( i );
    }

    Burada da 4) ile aynı output veriyor.

     

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    Bunlar yine asenkron. O yüzden sonuç nasıl olacak tek tek incelemek lazım.

    1. 5 adet time nesnesi oluşturur. Bunların intervalleri sırasıyla 1000, 2000, 3000, 4000 ve 5000 ms. O döngü hemen biter fakat 5 tane asenkron işlem oluşur. 6 rakamını yazmaması lazım. 1 yaz 1 saniye bekle 2 yaz 1 saniye bekle ... gibi olması lazım.

    2. Yukarıdakinin aynısı fakat interval sabit, 1000 ms. Sen 5 tane 1 s. sonra çalışacak işlem ayarlıyorsun, o yüzden hepsi aynı anda gerçekleşiyor.

    3., 4. ve 5. sorularda fark anonim bir fonksiyondan zamanlama işlemleri yapılması.


    Olaylara karışmayın!
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    makets
    makets's avatar
    Kayıt Tarihi: 17/Ocak/2010
    Erkek

    hocam 1) için aklımda şöyle bir kanı var

    i=1 iken 1. saniye dolmadan döngü tamamlanıyor ve 5 adet setTimeout çağrılıyor fakat timer() burada closure ve çağrılan her setTimeout() i=1,2,3,4,5 için 1000,2000,3000,4000,5000 ve her interval süresi dolduğunda setTimeout, timer fonksiyonunu çağırıyor ve bu esnada döngü tamamlandığından timer() i nin son değerini döndürüyor fakat i=5 dönmesi gerekirken 6 dönüyor onu çözemedim.

    Diğer kodlar içinse kafamda hala net bir şey oluşmadı 

    //intervaller edit

    //2. edit: Tamam hocam olay şu aslında for döngüsünde i++ ile i=6 oluyor ama i=<5 şartını sağlamadığından for döngüsü işlemeye devam etmiyor fakat timer() closure olduğundan i nin son değerini kullanabiliyor. Bu yaklaşımla bakıldığında 2) 3) 4) 5) soruları da çözülüyor. Mevzu hoşuma gitti :)

     

    makets tarafından 11/Kas/17 16:26 tarihinde düzenlenmiştir
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Hocam bunlar Asenkron işlemler program akışına etki etmiyor. Yani sen döngüde 3 defa döndüğünde i değeri aynı olabiliyor Yani şöyle.

    Sen function(){ 

    console.log(i)

    }

    Yazıyorsun ve bu fonksiyona bir interval değeri veriyorsun her 1 saniyenin sonunda yazdırılacak şeklinde.

    Fonksiyon 1 saniyenin sonunda o i değeri her ne ise onu alıyor. Yani Program akışı şu şekilde

    i=0 iken 1. interval değeri verildi

    i=1 iken 2. interval değeri verildi

    i=2 iken 3. interval değeri verildi

    .

    .

    .

    i=6 iken 7. interval değeri verildi.

    1. interval değeri verilen fonksiyon çağırıldı ve ekrana i değeri yazılacak. i yi stack den çekti değeri 6. Bunu ekrana yazdırdı.

    Eğer senkron olsaydı fonksiyon i değeri 1 iken stackten 1 i çekerdi. Bu yüzden oluyor 

     

    6 yazmasını sebebi senin oraya şart yazman kardeş :) 5 değeri de döngünün dönmesini sağlıyor çünkü <= koymuşsun.


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    makets
    makets's avatar
    Kayıt Tarihi: 17/Ocak/2010
    Erkek

    eyvallah hocam pekiştirmiş oldum, konu altından daha egzantrik sorular yığmam muhtemel. Çalışmaya devam.

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    makets bunu yazdı

    hocam 1) için aklımda şöyle bir kanı var

    i=1 iken 1. saniye dolmadan döngü tamamlanıyor ve 5 adet setTimeout çağrılıyor fakat timer() burada closure ve çağrılan her setTimeout() i=1,2,3,4,5 için 1000,2000,3000,4000,5000 ve her interval süresi dolduğunda setTimeout, timer fonksiyonunu çağırıyor ve bu esnada döngü tamamlandığından timer() i nin son değerini döndürüyor fakat i=5 dönmesi gerekirken 6 dönüyor onu çözemedim.

    Diğer kodlar içinse kafamda hala net bir şey oluşmadı 

    //intervaller edit

    //2. edit: Tamam hocam olay şu aslında for döngüsünde i++ ile i=6 oluyor ama i=

     

    2. editte yazdıkların doğru, benim dediklerim yanlış. i değişkeni timerın ulaşabileceği kapsamda. Yani en son i değeri neyse onu kullanıyor hep. Başka bir dilde olsaydı, i'nin kapsamı for döngüsünde olacaktı ve timer nesnesine kopyalanarak geçecekti. ...ve en önemlisi bizim i hiçbir zaman 6 olmayacaktı (aslında olacaktı ama biz görmeyecektik) çünkü bizim için yaşamayacaktı. Dediklerimden sadece asenkronluk ve tamamlanma zamanı doğru.


    Olaylara karışmayın!
Toplam Hit: 2732 Toplam Mesaj: 21
javascript