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
    Berceste.
    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 


    Fe Eyne Tezhebun?
  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
    Berceste.
    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.


    Fe Eyne Tezhebun?
  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: 1173 Toplam Mesaj: 21
javascript