Yerleşik
eval fonksiyonu,
kod şeklindeki bir karakter dizisini çalıştırmayı sağlar.
Sözdizimi şu şekildedir:
let result = eval(code);
Örneğin:
Bir
eval çalıştırmak son ifadenin sonucunu döndürür.
Örneğin:
Kod, o anki sözcüksel ortamda yürütülür, bu nedenle dış değişkenlere erişebilir.
Aynı şekilde dış değişkenleri de değiştirebilir:
Katı modda
eval kendi sözcüksel ortamına sahiptir. Bu nedenle eval içerisinde tanımlanan fonksiyon ve değişkenler dışarıdan ulaşılabilir değildir.
use strict kullanılmadığı takdirde
eval, kendi sözcüksel ortamına sahip değildir, bu yüzden
x ve
f ifadelerini dışarıdan görebiliriz.
Modern programlamada
eval, oldukça cüzi miktarda kullanılır. Kendisinden çoğunlukla “eval is evil” (eval kötüdür) şeklinde bahsedilir.
Nedeni oldukça basit: uzun, çok uzun zaman önce JavaScript, çoğu şeyin yalnızca
eval ile yapılabildiği, oldukça zayıf bir dildi. Fakat bu artık on yıl kadar öncede kaldı.
Şu an
eval kullanmak için neredeyse hiçbir neden bulunmuyor. Eğer birisi kullanıyorsa bunu modern bir dil yapısıyla veya bir JavaScript Modülü ile değiştirmek için iyi bir fırsatı var.
Halen dinamik bir
eval karakter dizisi şeklinde bir koda ihtiyacınız varsa lütfen bunun dış değişkenlere yan etkilere neden olarak erişebileceğinin farkında olun.
Kod küçültücüler (minifiers – JS kodlarını yayınlamadan önce sıkıştıran araçlar) yerel değişkenleri üretim için kısa olanlarıyla değiştirir. Bu genellikle güvenlidir, şayet birçok referansa sahip
eval kullanılmıyorsa. Dolayısıyla küçültücüler
evaldan görülebilen tüm yerel değişkenleri değiştirmez. Bu, kod sıkıştırma oranını büyük oranda kötü etkileyecektir.
evalın içinde dış yerel değişkenler kullanmak kod kontrolünü zorlaştıran kötü bir programlama yöntemidir.
Eval ile bağlantılı sorunlardan kaçınmanın iki adet yolu mevcut.
Eğer eval’laştırılmış kod dış değişkenleri kullanmıyorsas lütfen
evalı
window.eval(...) şeklinde kullanın:
Bu yöntem, kodu global kapsamda çalıştıracaktır.
Eğer kod yerel değişkenlere ihtiyaç duyuyorsa
new Function ile çalıştırın ve bunları argüman olarak geçirin:
new Function yapısı "new Function" yazımı bölümünde açıklanmıştır. Bu, bir karakter dizisinden, aynı zamanda global kapsamda olan bir fonksiyon yaratır. Bu yüzden yerel değişkenleri göremez. Fakat yukarıdaki örnekte de görülebileceği üzere bunları açık şekilde argüman olarak göndermek çok daha temiz bir yoldur.
eval(code) yapısı karakter dizisi formatındaki bir kodu çalıştırır ve son ifadenin sonucunu döndürür.
- Olabildiğince az ihtiyaç duyularak modern JavaScript’te nadiren kullanılır.
- Global kapsamda
evalkullanmak yerine
window.eval(code)kullanın.
- Veya kodunuz dış kapsamdan bazı verilere ihtiyaç duyuyorsa
new Functionkullanın ve bunları argüman olarak gönderin.