Zabudovaná funkce eval nám umožÅuje spustit ÅetÄzec kódu.
Syntaxe je:
let výsledek = eval(kód);
NapÅÃklad:
let kód = 'alert("Ahoj")';
eval(kód); // Ahoj
ÅetÄzec kódu může být dlouhý, může obsahovat konce Åádku, deklarace funkcÃ, promÄnné a podobnÄ.
Výsledkem funkce eval je výsledek poslednÃho pÅÃkazu.
PÅÃklad:
let hodnota = eval('1+1');
alert(hodnota); // 2
let hodnota = eval('let i = 0; ++i');
alert(hodnota); // 1
Vyhodnocovaný kód je spouÅ¡tÄn v aktuálnÃm lexikálnÃm prostÅedÃ, takže vidà vnÄjšà promÄnné:
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
Může vnÄjšà promÄnné také mÄnit:
let x = 5;
eval("x = 10");
alert(x); // 10, hodnota zmÄnÄna
Ve striktnÃm režimu má eval své vlastnà lexikálnà prostÅedÃ, takže funkce a promÄnné deklarované uvnitÅ eval nejsou viditelné zvenÄÃ:
// pamatujte: 'use strict' je ve spustitelných pÅÃkladech standardnÄ zapnuté
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (taková promÄnná neexistuje)
// funkce f rovnÄž nenà viditelná
Bez use strict nemá eval své vlastnà lexikálnà prostÅedÃ, takže bychom x a f venku vidÄli.
Použità âevalâ
V modernÃm programovánà se eval použÃvá velmi vzácnÄ. Äasto se ÅÃká, že âeval je zloâ (anglicky âeval is evilâ).
Důvod je jednoduchý: pÅed dávnými, dávnými Äasy byl JavaScript mnohem slabšà jazyk a mnoho vÄcà bylo možné provést jedinÄ pomocà eval. Ale tahle doba pominula už pÅed deseti lety.
V souÄasnosti nenà témÄŠžádný důvod, proÄ eval použÃvat. Pokud ho nÄkdo použÃvá, je velká Å¡ance, že ho lze nahradit nÄjakým modernÃm jazykovým konstruktem nebo JavaScriptovým modulem.
ProsÃme vÅ¡imnÄte si, že jeho schopnost pÅistupovat k vnÄjÅ¡Ãm promÄnným má vedlejšà efekty.
Minifikátory kódu (nástroje použÃvané pÅed odeslánÃm JS do produkce, aby jej zkomprimovaly) pÅejmenovávajà lokálnà promÄnné na kratšà (napÅ. a, b atd.), aby kód zkrátily. To je obvykle bezpeÄné, ale pÅi použità eval ne, protože vyhodnocovaný ÅetÄzec kódu může k lokálnÃm promÄnným pÅistupovat. Minifikátory tedy u promÄnných, které mohou být viditelné z eval, toto pÅejmenovánà neprovádÄjÃ. To negativnÄ ovlivÅuje pomÄr komprese kódu.
RovnÄž použÃvánà vnÄjÅ¡Ãch lokálnÃch promÄnných uvnitÅ eval se považuje za Å¡patnou programátorskou praktiku, protože ztÄžuje údržbu kódu.
Existujà dva způsoby, jak být pÅed takovými problémy zcela v bezpeÄÃ.
Jestliže vyhodnocovaný kód nepoužÃvá vnÄjšà promÄnné, prosÃme volejte eval jako window.eval(...):
TÃmto způsobem bude kód spuÅ¡tÄn v globálnÃm rozsahu platnosti:
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // 1 (globálnà promÄnná)
}
Jestliže vyhodnocovaný kód potÅebuje lokálnà promÄnné, zmÄÅte eval na new Function a pÅedejte je jako argumenty:
let f = new Function('a', 'alert(a)');
f(5); // 5
Konstrukt new Function je vysvÄtlen v kapitole Syntaxe ânew Functionâ. VytvoÅà funkci z ÅetÄzce, rovnÄž v globálnÃm rozsahu platnosti. Funkce tedy neuvidà lokálnà promÄnné. Je vÅ¡ak mnohem Äistšà pÅedat je explicitnÄ jako argumenty, tak jako v uvedeném pÅÃkladu.
ShrnutÃ
Volánà eval(kód) spustà ÅetÄzec kódu a vrátà výsledek poslednÃho pÅÃkazu.
- V modernÃm JavaScriptu se použÃvá málokdy, jelikož obvykle nenà zapotÅebÃ.
- Může pÅistupovat k vnÄjÅ¡Ãm lokálnÃm promÄnným. To se považuje za Å¡patnou praktiku.
- K vyhodnocenà kódu v globálnÃm rozsahu platnosti mÃsto nÄj použijte
window.eval(kód). - Nebo, jestliže váš kód potÅebuje data z vnÄjÅ¡Ãho rozsahu, použijte
new Functiona pÅedejte je jako argumenty.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)