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

selam mürid ler. JS çlışmaya başladım. Aşağıda 7 tane kod rneği verdim ve ekran çıktılarını yanına yazdım. Kodların bu çıktıları nasıl aldığını, 1) 2) 3) ... şeklinde sırasıyla açıklayabilecek babayiğit arıyorum. şahsen ben bir türlü çzemedim. 1) a = 2; console. log ; //2 2) var a; a = 2; console. log ; //2 3) a = 2; var a; console. log ; //2 4) console. log ; //2 var a; a= 2; 5) var a; console. log ; //2 a= 2; 6) console. log ; //undefined var a = 2; 7) console. log ; //ReferanceError a = 2; makets tarafından 05/Kas/17 13:42 tarihinde düzenlenmiştir

6 da console. log dersen 'a is not defined' der. Sonra var a = 2; dersen 'undefined' yazar. İlkinde a değişkeni yok zaten normal. İkinci durumda ise geri dnüş değeri olmadığı için 'undefined' yazar. Aslında iki durum da farklı. 6 il e7 aynı aslında. Burad asormak gereken soru bence şu olmalı: var a = 2; denildiğinde neden 'undefined' dndürüyor da a=2 dediğinde değişkenin değerini dndürüyor?

- 1. maddede herhangi bir sorun yok. Değişkenler var ifadesi olmadan üretilirseler global olurlar.- 2. maddede herhangi bir sorun yok. Değişken var ile tanımlanmış daha sonra herhangi bir ifade atanmış.- 3. maddede herhangi bir sorun yok. Değişken var ifadesi olmadan üretildiği için global değişken olmuş daha sonrasından var ile üretilmeye çalışılmış. Değişkenin tekrar üretilmeye çalışılması değişkenin değerini kaybettirmediği için istediğiniz kadar var yazın herhangi bir etkisi olmayacak.- 4. maddede olması gerektiği gibi çalıştırılırsa "undefined" sonucunu veriyor. "2" sonucunu vermiyor.- 5. maddede olması gerektiği gibi çalıştırılırsa "undefined" sonucunu veriyor. "2" sonucunu vermiyor..- 6. maddede herhangi bir sorun yok. Javascriptte "var " ifadeleri fonksiyonun en üstüne taşınırlar. Yani:Giriş yapılan kod: console. log ; var a = 2;Aslında çalışan: var a; console. log ; a = 2;Ekstra rnek: function f1 { function a return a ; function a } f1 ; // sonuç: "grüşürüz"Bununla ilgili daha fazla açıklamayı ve rneği "javascript hoisting" diye arayarak bulabilirsiniz.- 7. maddede herhangi bir sorun yok. Bir üstteki durumdaki gibi var ifadesi olmadığı için en üste taşınacak birşey olmuyor. Bylece a değişkeni referans hatası veriyor. Son sz: JavaScript'in byle uyuzlukları var. İnternette "deep understading javascript" yazarak çalışma prensiplerini anlatan sürüsüyle yazıyı inceleyebilirsiniz. Sadece bi imza..

Hocam 4 numarayı jsfiddle da denedim undefined yazıyor. 2 sonucunu vermiyo.

Hocam bunlar Asenkron işlemler program akışına etki etmiyor. Yani sen dngüde 3 defa dndüğünde i değeri aynı olabiliyor Yani şyle. Sen function 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 dngünün dnmesini 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 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 yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

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

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 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 yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

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 a=2; assignmentini mecvut scopta console. log satırından yukarıda arıyor ve yukarıda sadece declarated edilmiş ama assignment edilmemiş şekilde grdüğü 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

hocam 1) için aklımda şyle bir kanı var i=1 iken 1. saniye dolmadan dngü 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 dngü tamamlandığından timer i nin son değerini dndürüyor fakat i=5 dnmesi gerekirken 6 dnü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 dngü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 dngüsünde olacaktı ve timer nesnesine kopyalanarak geçecekti. ... ve en nemlisi bizim i hiçbir zaman 6 olmayacaktı çünkü bizim için yaşamayacaktı. Dediklerimden sadece asenkronluk ve tamamlanma zamanı doğru. Olaylara karışmayın!

takip yunusemre tarafından 05/Kas/17 15:13 tarihinde düzenlenmiştir "Programcılar saatler boyunca çalışmak zorunda kalmalarına engel olacak sistemler tasarlamaya saatler boyunca uğraşırlar." David Allen

nemli: JS'nin kapsam olayı biraz farklı. Ecma 2015'ten nce block scope tanımlı değil. Yani bir değişken ya fonksiyon içinde lokal olur ya da global. İkinci ilginç kısım şu: JS'de bir değişken tanımladığınızda, sanki o kapsamın başında yazmışsınız gibi işlem grür. Buna variable hoisting deniyor. Yani console. log ; //2 var a; a= 2; ile var a; console. log ; a = 2; arasında fark yok. En üst kapsam tarayıcıda window nesnesinin kapsamı olduğu için senin var ile tanımlamadığın değişkenler hep window nesnesinin altında tanımlanıyor. Mesela node. js'de durum farklı olabilir. Bu olayı console. log ile grebilirsin. Bu gibi karışıklıkları nlemek için: 1) var bildirimini doğru zamanda yapmalısın. 2) Kapsamlara dikkat etmelisin. 3) EMCA 2015 standardına uyan bir ortamda çalışacaksan var, let ifadelerini doğru kullanmalısın. 4) undefined'ın not defined ile arasındaki farkı gzetmen gerekir. 5) Duyurma ve ilkleme işlemlerine dikkat etmen gerekir. Zaten normalde ilklendirilmeyen hiçbir kaynağı kullanmamak gerekir. Kaynaklar: https://www.w3schools.com/js/js_scope. asp https://scotch.io/tutorials/understanding-scope-in-javascript https://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript https://docs.microsoft.com/en-us/scripting/javascript/advanced/variable-scope-javascript https://developer.mozilla. org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Declarations Olaylara karışmayın!

hocam her birinde ayrı ayrı belleği temizleyerek denedim. Şimdilik şurdan çalışıyorum: https://github.com/getify/You-Dont-Know-JS Bu soruları aşabilsem çalışmaya devam edicem ama 2 gündür çzemedim, pis takıldım.

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 a=2; assignmentini mecvut scopta console. log satırından yukarıda arıyor ve yukarıda sadece declarated edilmiş ama assignment edilmemiş şekilde grdüğü 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!

Güzel sorular. Zaten sorunlu sorular olduğu için ekstradan sorunlar çıkartmasın diye tarayıcıların console blümünden değil her biri için tek tek dosya oluşturup inceleyip bu mesajımı editleyeceğim. yeni mesaj atacağım. PcK0 tarafından 05/Kas/17 18:46 tarihinde düzenlenmiştir Sadece bi imza..

// makets tarafından 05/Kas/17 14:54 tarihinde düzenlenmiştir

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 , 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 , 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 , i 1000 ); }) ; } Burada 1) ile aynı output veriyor 4) for (var i=1; i<=5; i++) { (function { var j = i; setTimeout( function timer , 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 { setTimeout( function timer , j 1000 ); }) ; } Burada da 4) ile aynı output veriyor.

hocam 1) için aklımda şyle bir kanı var i=1 iken 1. saniye dolmadan dngü 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 dngü tamamlandığından timer i nin son değerini dndürüyor fakat i=5 dnmesi gerekirken 6 dnü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 dngüsünde i++ ile i=6 oluyor ama i=<5 şartını sağlamadığından for dngü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

1) eger tanimlanmamis bir degiskene deger atarsan global oldugu varsayilir 2) normal kullanim sekli 3) global oldu, tekrar tanimlamaya calistin gormezden gelip atama var ise yapip geciyor, var a =3 yapsan 3 yazardi 4) execution context. tanimlar dahil olduklari scope icerisinde yukari tasinir. ayrica nasil 2 yazdirdin? a degiskeni bu scope icerisinde tanimlidir ancak log fonksiyonu calistirildiginda undefined dir. 5) undefined, cunku log fonksiyonundan once deger atamasi yok 6) tanim yukari tasindi dolayisiyla degeri de olmadigi icin undefined 7) aslidna log fonksiyonundan sonra a degikeni global sayilacakti ancak bu islemde acik tanim olmadigi, ve a degiskenin bu scope icerisinde daha once tanimlanmadigi icin kod tanimsiz degiskene yapilan cagiridan dolayi calistirilmadi. javascriptin satir satir islemedigini unutmayin.

Beyin yakacak şekilde sormuşsun :) Zaten a=2 diyerek atama yapmışsın ilk rnekte. aralığındaki sorularında eğer aynı sekmede art arda yazdıysan zaten normal olarak hafızada tuttuğu a=2 değeri basar. 6. sorudaki kodları yazmadan nce ne yazdın bilmiyorum ama consol de var x =2; şeklinde tanımlama yapınca altında direk undefined yazar belkki onu diyorsundur. 7. soruda ReferanceError hatası almışsın. Muhtemelen consol belleğini boşaltıp denedin veya başka sekmede denedin ve tanımlı olmayan bir değişken çağrıldığı için ReferanceError hatası aldın. Not: js ğreneceksen Mozilla mdn bakmanı tavsiye ederim. nceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..

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 dngü 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!