Html - CSS - XML - JavaScript - Ajax
Javascript Basit Görünen Beyin Yakan Sorular
Javascript Basit Görünen Beyin Yakan Sorular
-
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 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:)
-
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
-
onca kurcalayistan sonra en iyisi YeniHarman hocamin da dediği gibi global scopeta 'use strict' basıp geçeyim kafam rahat.
-
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.
-
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ı.
-
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 :)
-
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.
-
eyvallah hocam pekiştirmiş oldum, konu altından daha egzantrik sorular yığmam muhtemel. Çalışmaya devam.
-
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.