Bu yazımızda Javascript ile daha düzenli ve daha temiz nasıl kod yazabiliriz ona değinmeye çalışacağım.
- Javascript alanında uzman geliştiriclier global değişkenler, new anahtar kelimesi, == operatörü ve eval() metodunu kullanmamamız konusunda ısrarla uyarılar yapıyorlar. Şimdi bunların daha iyi ve daha düzenli bir şekilde nasıl yazıldığına göz atalım.
Sayfa içerisinde global değişkenleri en aza indirmek bizim faydamıza olacaktır. Aklımıza hemen "Neden Global Değişken Kullanmamalıyım ?" sorusu geliyor.
Global değişkenler o sayfada kullanılan tüm javascript dosyalarını etkiler. Mesela 500 kişinin çalıştığı bi projede çalıştığınızı düşünün. Sizin ya da bir başkasının kazayla ya da bilerek tanımladığı global değişken tüm projenin aksamasına neden olabilir. Şöyle düşünün ekip arkadaşınız global değişkene x adını verdi ve sizde metot içinde bir x değişkeni tanımladınız. Program burada hata verir.
Bir metot veya koşullu ifadede tanımlanan tüm değişkenler yerel değişken olarak adlandırılır.
Yerel değişkenler var veya let anahtar sözcüğü ile tanımlanmalıdır. Aksi takdirde global değişken olurlar.
Katı (Strict Mode) Mod tanımlanmamış değişkenlerin kullanımına izin vermez.
Tüm değişken tanımların her komut dosyasının ya da metodun en üstünde yapmak iyi bir kodlama yöntemidir.
Bunun nedenlerini maddeler halinde sıralayacak olursak:
- Daha temiz ve hoş görünen bir kod yapımız olur.
- Değişkenlerin tek bir yerde olduğunu biliriz. Nerede tanımladık diye aramamıza gerek kalmaz.
- İstenmeyen ve kullanılmayan değişkenlerden kurtulmamız kolaylaşır.
- Bir değişkenin aynı isimle tekrar tanımlanmasının önüne geçmiş oluruz.
<script>
//Değişkenleri en üstte tanımlamalıyız
var x,y,z,total;
//Tanımladığımız değişkenleri kullanabiliriz.
x = 5;
y = 6;
z = 7;
</script>
Bu aynı zamanda döngü değerleri için de geçerlidir.
<script>
var i ;
for(i=0;i<5;i++){
alert(i)
}
</script>
Varsayılan olarak Javascript tüm bildirimleri üste kaldırır (Hoisting)
Değişkenleri tanımladığınızda bunlara başlangıç değeri vermek temiz ve düzenli kod yazmanın bir parçasıdır.
Bunu yapmak bize şunları kazandırır;
- Daha temiz kod yazmış oluruz.
- Değişkenleri tek bir anahtar kelimeyle (var veya let) tanımlamış oluruz.
- Tanımlanmamış değişkenlerden dolayı oluşacak hataların önüne geçmiş oluruz.
<script>
// Tek bir var ile birden fazla değişken tanımlayabiliriz.
var i = 5, y = 6, z = {}
</script>
Değişkenlere başlangıç değeri vermek, ne amaçla kullanılacağı veya kullanıldığı hakkında fikir sahibi olmamızı sağlar.
Number, string , boolean ve object veri türlerini nesne olarak kullanmamız kesinlikle önerilmiyor. Bu tipleri ilkel veri tipi olarak tanımlamamız daha doğru olacaktır.
Çünkü bu tipleri nesne olarak tanımlamak , yürütme hızını yavaşlatır ve programda hata çıkmasına neden olur.
Hatalı Kullanım:
<script>
var x = "Zafer";
var y = new String("Zafer");
(x === y) // False olur çünkü nesneleri karşılaştıramazsınız.
</script>
Bu da hatalı Kullanım:
<script>
var x = new String("Zafer");
var y = new String("Zafer");
(x == y) // Bu da yanlıştır. Nesneler karşılaştırılamaz.
</script>
Bunun yerine ilkel veri tiplerini kullanmamız Javascript açısından daha doğrudur.
- new Object() yerine {}
- new String yerine ""
- new Number() yerine "0" -> Burada sayısal değerlerden istediğiniz olabilir.
- new Boolean() yerine True veya False
- new Array() yerine []
- new RegExp yerine /()/
- new Funtion() yerine function(){}
kulanmamız tasiye ediliyor.
<script>
var x1 = {}; // yeni nesne
var x2 = ""; // ilkel metin
var x3 = 0; // ilkel sayı
var x4 = false; // ilkel mantıksal işlem
var x5 = []; // yeni dizi
var x6 = /()/; // yeni düzenli ifade stringi
var x7 = function(){}; // yeni fonksiyon
</script>
Javascript değişkenlerin hangi tür olduğunu otomatik belirliyor biliyorsunuz. Bazen bu başımıza büyük sorunlar açabilir. Jaascript Losely type yani gevşek bir yazılım dilidir (Hakaret etmedim sakin olun :) ) . Bir değişken farklı veri türleri içerebilir. Ve Javascript bir değişkenin veri türünü değiştirebilir.
<script>
var x = "Merhaba"; // typeof x ile değeri string string
x = 5; // değerini değiştirdiğimiz için türü de değişmiş oldu
</script>
Bir metni bir metinden çıkarmak hata oluşturmaz ancak geriye NaN değeri (Not a number) döner.
<script>
"Merhaba" - "kodlamaklazim" // returns NaN
</script>
== Operatörü her karşılaştırmadan önce türler aynı ise true döndürür.
=== Operatörü ise değerin ve tipin aynı olması durumunda true değerini döndürür.
<script>
1 == true; // true
0 === ""; // false
</script>
Eğer bir fonksiyonu çağırdığımız zaman biz parametre göndermezsek ve fonksiyonda parametre varsa undefined değerini alır ve fonksiyon parametre olmadığı için çalışmayı durdurur. Bunun önüne geçmek için parametrelere default değer verebiliriz.
<script>
function deneme(x, y) {
if (y === undefined) {
y = 0;
}
}
// ES2015 ile şu şekilde de yapabilirizi
function (a=1, b=1) { /*function code*/ }
</script>
Gerek olmadığını düşünseniz bile Switch Case ifadelerine default değer ekleyin.
<script>
var a =1;
switch(a){
case 1:
alert(1)
break;
default:
alert("Deger Yok";)
}
</script>
Eval Metodu metni kod olarak çalıştırmanıza izin verir. Bazı durumlarda bu güvenlik sorunu teşkil edebilir.