




Javascript Basit Görünen Beyin Yakan Sorular
-
selam mürid(e)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. (Not: her bir kod örneği consoleda bellek temizlenerek denenmiştir.)
1) a = 2; console.log( a ); //2 2) var a; a = 2; console.log( a ); //2 3) a = 2; var a; console.log( a ); //2 4) console.log( a ); //2 var a; a= 2; 5) var a; console.log( a ); //2 a= 2; 6) console.log( a ); //undefined var a = 2; 7) console.log( a ); //ReferanceError a = 2;
-
Beyin yakacak şekilde sormuşsun :)
Zaten a=2 diyerek atama yapmışsın ilk örnekte. [1-5] 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.
-
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.
-
6 da console.log(a) 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 dönüş 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' döndürüyor da a=2 dediğinde değişkenin değerini döndürüyor?
-
-
takip
yunusemre tarafından 05/Kas/17 15:13 tarihinde düzenlenmiştir -
Güzel sorular. Zaten sorunlu sorular olduğu için ekstradan sorunlar çıkartmasın diye tarayıcıların console bölümünden değil her biri için tek tek dosya oluşturup inceleyip bu mesajımı editleyeceğim. yeni mesaj atacağım.
-
Hocam 4 numarayı jsfiddle da denedim undefined yazıyor. 2 sonucunu vermiyo.
-
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(bkz. execution context) 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.
-
- 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 [değişken]" ifadeleri fonksiyonun en üstüne taşınırlar. Yani:
Giriş yapılan kod:
console.log(a);
var a = 2;
Aslında çalışan:
var a;
console.log(a);
a = 2;
Ekstra örnek:
function f1() {
function a() {
return "merhaba";
}
return a();
function a() {
return "görüşürüz";
}
}
f1(); // sonuç: "görüşü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. Böylece a değişkeni referans hatası veriyor.
Son söz: JavaScript'in böyle uyuzlukları var. İnternette "deep understading javascript" yazarak çalışma prensiplerini anlatan sürüsüyle yazıyı inceleyebilirsiniz. -
Önemli:
JS'nin kapsam (scope) 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 görür. Buna variable hoisting deniyor. Yani
console.log( a ); //2
var a;
a= 2;
ile
var a;
console.log (a);
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(window) ile görebilirsin.
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 (değişkeni blok kapsamında kısıtlar) ifadelerini doğru kullanmalısın.
4) undefined'ın not defined ile arasındaki farkı gözetmen gerekir.
5) Duyurma (decleration) ve ilkleme işlemlerine dikkat etmen gerekir. Zaten normalde ilklendirilmeyen (yani bir atama yapılmamış) 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