Javascriptte bazen değişkenin değeri çeşitli javascript kodlarından oluşabilir ve bu kodları çalıştırmaya ihtiyaç duyabiliriz yada AJAX tan dönen veri sayfada çalıştırılması gereken javascript kodlarından oluşabilir. İlk durum için bir fonksiyon yazmak bizi kurtarabilir. Hatta fonksiyon yazmanın çoğu durumda daha avantajlı olduğu söylenebilir. Ancak ikinci durum için bir fonksiyon yazmak her zaman bizi kurtarmayabilir. İşte o zaman eval() imdadımıza koşar.
Öncelikle eval() nedir ? Nasıl kullanılır bir inceleyelim. eval() değişkenin değerini bir javascript kodu gibi çalıştırır dediğimize göre öncelikle içinde javascript kodları bulunan bir değişkene ihtiyacımız olacak.
var calistirilacak = "alert(\"Merhaba Ceviz\")"
Bu değişkeni çalıştırmak içinse yapmamız gereken tek şey eval() in içine değişkenimizin adını yazmak
eval(calistirilacak)
Böyle bir kodu sayfanızda kullandığınızda içinde 'Merhaba Ceviz' yazan bir uyarı kutusu çıkacaktır. Sizinde gördüğünüz gibi bu kadar basit bir iş için bile fazlasıyla uğraştık. Belki artık 'Merhaba Ceviz' yazmak için sadece eval(calistirilacak) yazmamız bir avantaj ama aynı işi direk alert kullanarakta yapabiliriz. Yine de art arda bir kaç kez çalışacak bir kodu değişken içine yerleştirip eval ile çağırabiliriz ancak aynı işi fonksiyonlar çok daha iyi yapacaktır ve ilerde olası bir değişiklik için fonksiyonlar bize daha rahat bir çalışma imkanı verecektir. Görüldüğü gibi böyle bir işte eval() çok işimize yaramadı zaten AJAX ın olmadığı durumlarda genellikle eval() den iyi alternatifler bulunur.
Şimdi işin içine AJAX girince eval() in bize getirdiği kolaylıklara bir bakalım. Şöyle bir senaryomuz olsun. Sitenizde nadir kullandığınız ama olmazsa olmaz bir javascript fonksiyonu var. Sitenizin hızlı açılması için bu fonksiyonu eğer gerekirse AJAX la sonradan sayfaya dahil etmek istiyorsunuz. Hemen aklınıza kodu sunucudan çekip bir DIV in içine yazmak geliyor. Böylece kodu sonradan ekleyip kullanabileceksiniz ama bu şekilde yapınca fonksiyonunuzun_adi is not defined şeklinde bir hata alıyorsunuz. Oysa bu işi eval() ile yapabilirsiniz hemde daha kolay bir şekilde. Bir örnek yapalım.
index.html
var XHttp, a_func //XHttp -> XMLHttpRequest nesnesi, a_func -> AJAX ile çekeceğimiz kodları saklayacağımız değişken
//Normalde XMLHttpRequest nesnesi oluşturulurken try-catch bloğu kullanılır ancak bu bloğu bilmeyenler olabileceğinden bu şekilde nesneyi oluşturdum. if(navigator.appName == "Microsoft Internet Explorer") { XHttp =new ActiveXObject("Microsoft.XMLHTTP"); } else { XHttp =new XMLHttpRequest(); }
Kodlarda görüldüğü gibi 2 temel şekilde yapılabilinir ancak ikincisinde eval(XHttp.responseText) deyince m_ceviz() fonksiyonunu yalnızca XHttp.onreadystatechange içinde çalışır.(bknz. Kapsam [Scope]) Bunların dışında bir nesne oluşturup fonksiyonları o nesnenin bir metodu haline getirmekte yapılabilinecekler arasında.