var age=27;// bu bir primitive değişken
var obj={
name:'Ali',
city:'Ankara'
};//burda bir obje olsun
function change(a,b){
a=30;
b.city='İzmir';
}
change(age,obj);
console.log(age,obj);
Nasıl oluyorda konsolda 27 izmir yazıyor? fonksiyon objenin city değerini değiştiriken age değeri neden 27 kalıyor? Return olmadığından mı yoksa değişkenlerin tanımlanmasındaki scope hiyerarşisinden mi?
fonksiyon çağrılırken primitive tiplerin değeri diğer tiplerin referansı geçiliyor o yüzden
tam bir "pass by value / pass by reference" sorusu. JavaScript de referans ve hafiza alani nasil calisir?
"age" diye bir referans olusturuyorsun, bunu bir adres gibi dusun. bu referans icinde 27 olan bir hafiza alanini gosteriyor. "obj" diye bir referans olusturuyorsun, bu referans icinde baska referanslarin oldugu hafiza alanini gosteriyor. buna obje deniliyor. simdi bir de "city" diye bir referans olusturuyorsun, bu da icinde "Ankara" yazan hafiza alanini gosteriyor. Kisaca elinde soyle bir yapi oluyor;
age->27 ve obj->city->'Ankara'
age, obj, city adli 3 referans. 27 ve 'Ankara' diye iki hafiza alani.
fonksiyona age ve obj referansini gonderiyorsun. Ama javascript "pass by value" calistigi icin fonksiyona gelen referansi degil de degerini kopyalar. yani gelen age referansini degil de 27 degerini alir, hafizada o 27 icin yeni bir yer acar yani kopyalar ve onu yeni olusturulan "a" referansi ile gosterir. daha sonra gelen objeyi yani icinde bircok referans bulunduran hafiza alanini alir, kopyalar ve yeni hafiza alani acar ve bu hafiza alanini "b" referansi ile gosterir.
simdi elinde icinde degerleri farkli olsa da iki farkli hafiza alani var ve icinde ikisi de 27 degerini tutuyor.
age->27
a->27
ayrica birbirinin kopyasi iki farkli hafiza alani var, ikisinde de birbirinin kopyasi iki referans var. ama bu city referanslari ayni hafiza alanini gosteriyor.
obj->city
b->city
city->"ankara"
yani son durum su; age, a, obj, b, city diye referanslar var. bunun yaninda icinde 27, 27, "ankara" bulunduran hafiza alanlarin;
age->27
a->27
obj->city
b->city
city->"ankara"
sen simdi method icinde diyorsun ki a referansinin gosterdigi hafiza alanini 30 ile degistir. ve diyorsun ki b nin gosterdigi hafiza alanindaki city referansinin gosterdigi hafiza alanini "Izmir ile degistir.". Simdi hafizada durum su oldu;
age->27
a->30
obj->city
b->city
city->"Izmir"
sonra da fonksiyon bitince diyorsun ki; age referansinin gosterdigi hafiza alaninin degrini bana yaz ve hala 27. bir de obj referansinin gosterdigi hafiza alanindaki city referaninin gosterdigi hafiza alaninini bana yaz yani "Izmir". hafizanda hala a referansinin gosteridigi 30 degeri var ve artik kullanilamayacaigi icin bu hafiza alani temizlenecek.
Javascript "pass by value" bir dildir, ama objelerde obje alaninidaki degerler de pass bu value olarak gecse bu value lar tarafindan degerler birebir ayni hafiza alanini gosterdigi icin sanki "pass by referance" olmus gibi bir durum olur.
Javascriptin derinliklerini anlayinca hersey daha anlamli olur.