ÐÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ eval позволÑÐµÑ Ð²ÑполнÑÑÑ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð°.
СинÑакÑиÑ:
let result = eval(code);
ÐапÑимеÑ:
let code = 'alert("ÐÑивеÑ")';
eval(code); // ÐÑивеÑ
СÑÑока кода Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑой, ÑодеÑжаÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ ÑÑÑок, обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑий, пеÑеменнÑе и Ñ.п.
РезÑлÑÑаÑом eval бÑÐ´ÐµÑ ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней инÑÑÑÑкÑии.
ÐапÑимеÑ:
let value = eval('1+1');
alert(value); // 2
let value = eval('let i = 0; ++i');
alert(value); // 1
Ðод в eval вÑполнÑеÑÑÑ Ð² ÑекÑÑем лекÑиÑеÑком окÑÑжении, поÑÑÐ¾Ð¼Ñ ÐµÐ¼Ñ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð²Ð½ÐµÑние пеÑеменнÑе:
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
ÐнаÑÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ изменÑÑÑ:
let x = 5;
eval("x = 10");
alert(x); // 10, знаÑение изменено
Ð ÑÑÑогом Ñежиме Ñ eval имееÑÑÑ ÑÐ²Ð¾Ñ Ð»ÐµÐºÑиÑеÑкое окÑÑжение. ÐоÑÑÐ¾Ð¼Ñ ÑÑнкÑии и пеÑеменнÑе, обÑÑвленнÑе внÑÑÑи eval, нелÑÐ·Ñ ÑвидеÑÑ ÑнаÑÑжи:
// напоминание: Ñежим 'use strict' вклÑÑÑн по ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¾ вÑеÑ
иÑполнÑемÑÑ
пÑимеÑаÑ
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (Ð½ÐµÑ Ñакой пеÑеменной)
// ÑÑнкÑÐ¸Ñ f Ñоже невидима
Ðез use strict Ñ eval не бÑÐ´ÐµÑ Ð¾ÑделÑного лекÑиÑеÑкого окÑÑжениÑ, поÑÑÐ¾Ð¼Ñ x и f бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð¸Ð· внеÑнего кода.
ÐÑполÑзование «eval»
Ð ÑовÑеменной ÑазÑабоÑке на JavaScript eval иÑполÑзÑеÑÑÑ Ð²ÐµÑÑма Ñедко. ÐÑÑÑ Ð´Ð°Ð¶Ðµ извеÑÑное вÑÑажение â «eval is evil» («eval â ÑÑо зло»).
ÐÑиÑина Ñакого оÑноÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑа: давнÑм-давно JavaScript бÑл не оÑÐµÐ½Ñ ÑазвиÑÑм ÑзÑком, и многие веÑи можно бÑло ÑделаÑÑ ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ eval. Ðо Ñа ÑпоÑ
а законÑилаÑÑ Ð±Ð¾Ð»ÐµÐµ деÑÑÑи Ð»ÐµÑ Ð½Ð°Ð·Ð°Ð´.
Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
пÑиÑин, ÑÑÐ¾Ð±Ñ Ð¿ÑодолжаÑÑ Ð¸ÑполÑзоваÑÑ eval. ÐÑли кÑо-Ñо вÑÑ ÐµÑÑ Ð´ÐµÐ»Ð°ÐµÑ ÑÑо, Ñо оÑÐµÐ½Ñ Ð²ÐµÑоÑÑно, ÑÑо они легко ÑмогÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ eval более ÑовÑеменнÑми конÑÑÑÑкÑиÑми или JavaScript-модÑлÑми.
ÐожалÑйÑÑа, имейÑе в видÑ, ÑÑо код в eval ÑпоÑобен полÑÑаÑÑ Ð´Ð¾ÑÑÑп к внеÑним пеÑеменнÑм, и ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾Ð±Ð¾ÑнÑе ÑÑÑекÑÑ.
ÐиниÑикаÑоÑÑ ÐºÐ¾Ð´Ð° (инÑÑÑÑменÑÑ, иÑполÑзÑемÑе Ð´Ð»Ñ ÑжаÑÐ¸Ñ JS-кода пеÑед Ñем, как оÑпÑавиÑÑ ÐµÐ³Ð¾ конеÑнÑм полÑзоваÑелÑм) заменÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе пеÑеменнÑе на дÑÑгие Ñ Ð±Ð¾Ð»ÐµÐµ коÑоÑкими именами Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии. ÐбÑÑно ÑÑо безопаÑÐ½Ð°Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлÑÑиÑ, но не Ñогда, когда в коде иÑполÑзÑеÑÑÑ eval, Ñак как код из eval Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ
пеÑеменнÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ð¸Ð½Ð¸ÑикаÑоÑÑ Ð½Ðµ ÑÑогаÑÑ Ð¸Ð¼ÐµÐ½Ð° пеÑеменнÑÑ
, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð¸Ð· eval. ÐÑо ÑÑ
ÑдÑÐ°ÐµÑ ÑÑÐµÐ¿ÐµÐ½Ñ ÑжаÑÐ¸Ñ ÐºÐ¾Ð´Ð°.
ÐÑполÑзование внÑÑÑи eval локалÑнÑÑ
пеÑеменнÑÑ
из внеÑнего кода ÑÑиÑаеÑÑÑ Ð¿Ð»Ð¾Ñ
им ÑеÑением, Ñак как ÑÑо ÑÑложнÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¿Ð¾ поддеÑжке Ñакого кода.
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° пÑÑи, как гаÑанÑиÑованно избежаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ Ð¿Ñоблем.
ÐÑли код внÑÑÑи eval не иÑполÑзÑÐµÑ Ð²Ð½ÐµÑние пеÑеменнÑе, Ñо вÑзÑвайÑе его Ñак â window.eval(...):
Ð ÑÑом ÑлÑÑае код вÑполнÑеÑÑÑ Ð² глобалÑной облаÑÑи видимоÑÑи:
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // 1 (глобалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ)
}
ÐÑли ÐºÐ¾Ð´Ñ Ð²Ð½ÑÑÑи eval нÑÐ¶Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑе пеÑеменнÑе, поменÑйÑе eval на new Function и пеÑедавайÑе необÑ
одимÑе даннÑе как аÑгÑменÑÑ:
let f = new Function('a', 'alert(a)');
f(5); // 5
ÐонÑÑÑÑкÑÐ¸Ñ new Function обÑÑÑнÑеÑÑÑ Ð² главе СинÑакÑÐ¸Ñ "new Function". Ðна ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð¸Ð· ÑÑÑоки в глобалÑной облаÑÑи видимоÑÑи. Так ÑÑо локалÑнÑе пеÑеменнÑе Ð´Ð»Ñ Ð½ÐµÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ, но вÑегда можно пеÑедаÑÑ Ð¸Ñ
как аÑгÑменÑÑ. ÐолÑÑаеÑÑÑ Ð¾ÑÐµÐ½Ñ Ð°ÐºÐºÑÑаÑнÑй код, как в пÑимеÑе вÑÑе.
ÐÑого
ÐÑзов eval(code) вÑполнÑÐµÑ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð° и возвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ñледней инÑÑÑÑкÑии.
- ÐÑо Ñедко иÑполÑзÑеÑÑÑ Ð² ÑовÑеменном JavaScript, Ñак как в ÑÑом обÑÑно Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи.
- Ðозможен доÑÑÑп к внеÑним локалÑнÑм пеÑеменнÑм. ÐÑо ÑÑиÑаеÑÑÑ Ð¿Ð»Ð¾Ñ Ð¾Ð¹ пÑакÑикой.
- ЧÑÐ¾Ð±Ñ Ð²ÑполниÑÑ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð° Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
evalв глобалÑной облаÑÑи видимоÑÑи, иÑполÑзÑйÑеwindow.eval(code). - Ðли же, еÑли Ð²Ð°Ñ ÐºÐ¾Ð´ нÑждаеÑÑÑ Ð² какиÑ
-Ñо даннÑÑ
из внеÑней облаÑÑи видимоÑÑи, Ñо иÑполÑзÑйÑе
new Function, пеÑедав ÑÑи даннÑе в каÑеÑÑве аÑгÑменÑов.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)