ÐбÑдована ÑÑнкÑÑÑ 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â¦)