YerleÅik eval fonksiyonu, kod Åeklindeki bir karakter dizisini çalıÅtırmayı saÄlar.
Sözdizimi Åu Åekildedir:
let result = eval(code);
ÃrneÄin:
let code = 'alert("Esenlikler")';
eval(code); // Esenlikler
Bir eval çalıÅtırmak son ifadenin sonucunu döndürür.
ÃrneÄin:
let value = eval('1+1');
alert(value); // 2
Kod, o anki sözcüksel ortamda yürütülür, bu nedenle dıŠdeÄiÅkenlere eriÅebilir.
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
Aynı Åekilde dıŠdeÄiÅkenleri de deÄiÅtirebilir:
let x = 5;
eval("x = 10");
alert(x); // 10, deÄer deÄiÅti
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.
// hatırlatma: çalıÅtırılabilir örneklerde 'use strict' varsayılan olarak etkin durumdadır.
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (böyle bir deÄiÅken yok)
// f fonksiyonu da aynı Åekilde ulaÅılmaz durumda
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.
âEvalâ kullanımı
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.
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // 1 (global deÄiÅken)
}
EÄer kod yerel deÄiÅkenlere ihtiyaç duyuyorsa new Function ile çalıÅtırın ve bunları argüman olarak geçirin:
let f = new Function('a', 'alert(a)');
f(5); // 5
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.
Ãzet
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 yerinewindow.eval(code)kullanın. - Veya kodunuz dıŠkapsamdan bazı verilere ihtiyaç duyuyorsa
new Functionkullanın ve bunları argüman olarak gönderin.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)