jquery

JavaScript’deki ‘undefined’ın undefined olduğundan emin olmak

Okumak iyidir. Kaynak kod okumak ise, bir yazılımcının gelişmesindeki en önemli faktörlerden birisidir. Açık kaynak dünyası sağolsun, “vay lan bu ne güzel şey” dediğimiz çoğu şeyin kaynak kodunu inceleyip geliştirme ve hatta daha güzelini yapma şansına sahibiz. jQuery ise, kolaylığı ile gönlümüze taht kurmuş bir JavaScript kod geliştirme çatısı. Bundan 1.5 yıl kadar önce 3-5 […]

Okumak iyidir. Kaynak kod okumak ise, bir yazılımcının gelişmesindeki en önemli faktörlerden birisidir. Açık kaynak dünyası sağolsun, “vay lan bu ne güzel şey” dediğimiz çoğu şeyin kaynak kodunu inceleyip geliştirme ve hatta daha güzelini yapma şansına sahibiz.

jQuery ise, kolaylığı ile gönlümüze taht kurmuş bir JavaScript kod geliştirme çatısı. Bundan 1.5 yıl kadar önce 3-5 kez, jQuery kaynak kodunu okuma teşebüssüm olmuştu. Ancak adaha ilk satırındaki şu koddan sonra “yok, ben yapamayacağım bu işi” diyerek bırakmıştım.
Tüm jQuery kodu, bir “self executing anonym function” içinde çalıştırılıyordu. Dolayısıyla global objeye bir müdahalede bulunmuyordu. Bu bir framework’ün yapması gereken bir şeydi.

Kodlar şu şekilde yazılmıştı;

(function( window, undefined ) { //buradada anonym functionün'ın aldığı parametreler vardı
//burada yüzlerce satır jquery kodu
})(window); //burada da function'ı çalıştıran parametreler

jQuery kodundaki daha bu ilk satırı okuduğumda, oradaki “undefined”ın neden orada olduğunu anlayamadığım için kodu okumayı bırakıyordum. Ve bu çok sinirimi bozuyordu…
Ancak, birkaç gün sonra okuduğum bir makale, bu konu hakkında bir ipucu veriyordu; “JavaScript’deki undefined değişkeni, dışarıdan değiştirilebiliyordu”.

Şu kodu inceleyelim;

var a; //a'ya henuz bir deger tanimlamadik
console.log(a == undefined) //bu bize true dönecektir, çünkü a'ya bir değer atamadık

Buraya kadar her şey normal görünüyordu. Ta ki şöyle bir kodu görünceye kadar

undefined = true; //burada 'undefined' değişkenini true olarak değiştirdik (bkz: dananın kuyruğunun koptuğu yer)
var a; //a'ya henuz bir deger tanimlamadik
console.log(a == undefined) //bu bize false dönecektir, çünkü artık bu koşul, a'nın 'true' olmasını bekliyor

jQuery geliştiricileri de bu sorunu en azından kütüphane içinde önlemek için, kodun son satırında, anonym function’ı execute eden ikinci parametreyi göndermeyerek ve bu göndermedikleri parametreyi kodun ilk satırında ‘undefined’ olarak tanımlayarak, o closure içindeki ‘undefined’ın gerçekden ‘undefined’ olmasını sağlıyorlar.

Eğer bir kütüphane yazıyorsanız veya yeterince paranoyaksanız, closure’unuza bu şekilde bir ‘undefined’ tanımlaması yapabilirsiniz.