تابع درÙÙÛ eval اجاز٠Ù
Û Ø¯ÙØ¯ تا ÛÚ© رشت٠از کد را اجرا Ú©ÙÛØ¯
Ø¯Ø³ØªÙØ±:
let result = eval(code);
ب٠عÙÙØ§Ù ٠ثاÙ:
let code = 'alert("Hello")';
eval(code); // Hello
Ø±Ø´ØªÙ Ù Û ØªÙØ§Ùد Ø·ÙÙØ§ÙÛ Ù ÚÙØ¯ Ø®Ø·Û Ø¨Ø§Ø´Ø¯Ø ØªØ§Ø¨Ø¹ ÛØ§ ٠تغÛÛØ± Ø§Ø¹ÙØ§Ù Ú©ÙØ¯ Ùâ¦
Ø®Ø±ÙØ¬Û eval ÙÙ
Ø§Ù ÙØªÛج٠آخرÛ٠عÙ
ÙÛØ§Øª است
Ø¨Ø±Ø§Û ÙÙ ÙÙÙ:
let value = eval('1+1');
alert(value); // 2
let value = eval('let i = 0; ++i');
alert(value); // 1
رشت٠در Ù ØÛØ· Ø¬Ø§Ø±Û Ø§Ø¬Ø±Ø§ Ù Û Ø´ÙØ¯ Ø¨ÙØ§Ø¨Ø±Ø§Û٠ب٠٠تغÛÛØ± ÙØ§Û Ø®Ø§Ø±Ø¬Û Ø¯Ø± Scope Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø±Ø¯:
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
ÙÙ ÚÙÛÙ Ù Û ØªÙØ§Ùد ٠تغÛÛØ± ÙØ§Û Ø®Ø§Ø±Ø¬Û Ø±Ø§ ÙÛØ² تغÛÛØ± Ø¯ÙØ¯:
let x = 5;
eval("x = 10");
alert(x); // 10, value modified
در strict mode, eval Ù
ØÛØ· خاص Ø®ÙØ¯Ø´ را دارد. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ ØªÙØ§Ø¨Ø¹ Ù Ù
تغÛÛØ± ÙØ§Û Ø§Ø¹ÙØ§Ù شد٠در eval در خارج ÙØ§Ø¨Ù Ø¯Ø³ØªØ±Ø³Û ÙÛØ³ØªÙد:
// reminder: 'use strict' is enabled in runnable examples by default
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (no such variable)
// function f is also not visible
بدÙÙ use strict, eval Ù
ØÛØ· خاص Ø®ÙØ¯Ø´ را ÙØ¯Ø§Ø±Ø¯, بر اÛ٠اساس Ù
ا x Ù f در خارج ÙØ§Ø¨Ù Ø¯Ø³ØªØ±Ø³Û Ø§ÙØ¯.
Ø§Ø³ØªÙØ§Ø¯Ù از âevalâ
در Ø¨Ø±ÙØ§Ù
Ù ÙÙÛØ³Û Ù
در٠eval Ø¨Ù ÙØ¯Ø±Øª Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛØ´Ùد. Ø¨Ù Ø·ÙØ± Ù
عÙ
ÙÙ Ú¯ÙØªÙ Ù
Û Ø´ÙØ¯ âeval is evilâ.
دÙÛÙØ´ ساد٠است: Ø®ÛÙÛ ÙÙØª Ù¾ÛØ´ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ÛÚ© Ø²Ø¨Ø§Ù Ø¨Ø³ÛØ§Ø± ضعÛ٠تر Ø¨ÙØ¯Ø Ø®ÛÙÛ ÚÛØ² ÙØ§ تÙÙØ§ Ù
Û ØªÙØ§ÙØ³ØªÙØ¯ با eval Ø§ÙØ¬Ø§Ù
Ø´ÙÙØ¯ اÙ
ا ÛÚ© دÙ٠از Ø¢Ùگا٠Ù
Û Ú¯Ø°Ø±Ø¯.
اکÙÙÙ, ÙÛÚ Ø¯ÙÛÙÛ Ø¨Ø±Ø§Û Ø§Ø³ØªÙØ§Ø¯Ù از eval ÙÛØ³Øª. اگر Ú©Ø³Û Ø§Ø² Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
Û Ú©ÙØ¯Ø Ù
ÛØªÙØ§ÙØ¯ Ø¨Ø±Ø§Û Ø¬Ø§ÛگزÛ٠کرد٠آ٠از ساخت ÙØ§Û Ù
Ø¯Ø±Ù Ø²Ø¨Ø§Ù ÛØ§ JavaScript Module Ø¨ÙØ±Ù Ø¨Ú¯ÛØ±Ø¯.
ÙØ·Ùا ØªÙØ¬Ù Ú©ÙÛØ¯ Ú©Ù ÙØ§Ø¨ÙÛØª Ø¢Ù Ø¨Ø±Ø§Û Ø¯Ø³ØªØ±Ø³Û Ø¨Ù Ù ØªØºÛÛØ± ÙØ§Û Ø®Ø§Ø±Ø¬Û Ø¹ÙØ§Ø±Ø¶ Ø¬Ø§ÙØ¨Û دارد.
) ÙØ´Ø±Ø¯Ù Ú©ÙÙØ¯Ú¯Ø§Ù کدCode minifiers( Ù
ØªØºÛØ± ÙØ§Û Ù
ØÙÛ Ø±Ø§ Ø¨Ù ÙØ§Ù
ÙØ§Û Ú©ÙØªØ§Ù تر تغÛÛØ± ÙØ§Ù
Ù
Û Ø¯ÙÙØ¯ (Ù
اÙÙØ¯ aÙ b) Ø¨Ø±Ø§Û Ú©ÙØªØ§Ù کرد٠کد. اÛ٠کار Ù
عÙ
ÙÙØ§ Ù
Ø´Ú©ÙÛ Ø§ÛØ¬Ø§Ø¯ ÙÙ
Û Ú©ÙØ¯ اÙ
ا ÙÙ ÙÙØªÛ Ú©Ù eval Ø§Ø³ØªÙØ§Ø¯Ù شدÙ, از Ø¢ÙØ¬Ø§ Ú©Ù Ù
تغÛÛØ± ÙØ§Û Ù
ØÙÛ Ø´Ø§ÛØ¯ از طرÛÙ eval Ù
ÙØ±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù ÙØ±Ø§Ø± Ú¯Ø±ÙØªÙ Ø¨Ø§Ø´ÙØ¯ Ø¨ÙØ§Ø¨Ø±Ø§Û٠خرد Ú©ÙÙØ¯Ú¯Ø§Ù Ù
تغÛÛØ± ÙØ§ÛÛ Ú©Ù Ù
Û ØªÙØ§ÙÙØ¯ ØªÙØ³Ø· eval Ù
ÙØ±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù ÙØ±Ø§ Ú¯Ø±ÙØªÙ Ø¨Ø§Ø´ÙØ¯ را تغÛÛØ± ÙÙ
Û Ø¯ÙÙØ¯ ک٠باعث Ú©Ø§ÙØ´ Ø¶Ø±ÛØ¨ ÙØ´Ø±Ø¯Ù Ø³Ø§Ø²Û Ù
Û Ø´ÙØ¯.
Ø§Ø³ØªÙØ§Ø¯Ù از Ù
تغÛÛØ± ÙØ§Û درÙÙ eval در خارج از Ø¢Ù ÙÙ
ÚÙÛÙ ÙØ§Ù
ÙØ§Ø³Ø¨ است, ÚØ±Ø§Ú©Ù ÙÚ¯ÙØ¯Ø§Ø±Û کد را سخت تر Ù
Û Ú©ÙØ¯.
د٠را Ø¨Ø±Ø§Û Ø§ÛÙ Ù Ù Ø§ÙØ¯Ù از ÚÙÛÙ Ù Ø´Ú©ÙØ§ØªÛ ÙØ¬Ùد دارد.
اگر eval از Ù
تغÛÛØ± ÙØ§Û Ø®Ø§Ø±Ø¬Û Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ
Û Ú©ÙØ¯, ÙØ·Ùا eval را Ø¨Ù ØµÙØ±Øª window.eval(...) ÙØ±Ø§ Ø¨Ø®ÙØ§ÙÛØ¯:
در اÛÙ ØµÙØ±Øª رشت٠در Ù ØÛØ· ع٠ÙÙ Û (global scope) اجرا Ù Û Ø´ÙØ¯
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // 1 (global variable)
}
اگر رشت٠کد ÙÛØ§Ø² ب٠Ù
تغÛÛØ± ÙØ§Û Ø®Ø§Ø±Ø¬Û Ø¯Ø§Ø±Ø¯, eval را ب٠new Function تغÛÛØ± دÙÛØ¯ ٠آÙÙØ§ را ب٠عÙÙØ§Ù آرگÙÙ
ا٠ب٠آ٠پاس دÙÛØ¯:
let f = new Function('a', 'alert(a)');
f(5); // 5
new Function در بخش ØªÙØ¶ÛØ Ø¯Ø§Ø¯Ù Ø´Ø¯Ù Ø§Ø³Øª سÛÙØªÚ©Ø³ "new Function". Ø¢Ù ÛÚ© تابع با Ø§Ø³ØªÙØ§Ø¯Ù از ÛÚ© Ø±Ø´ØªÙ Ø§ÛØ¬Ø§Ø¯ Ù
Û Ú©ÙØ¯, ÙÙ
ÚÙÛ٠در Ù
ØÛØ· عÙ
ÙÙ
Û. Ø¨ÙØ§Ø¨Ø±Ø§Û٠آ٠ÙÙ
Û ØªÙØ§Ùد دÛگر Ù
تغÛÛØ± ÙØ§Û Ù
ØÙÛ Ø±Ø§ ببÛÙØ¯ اÙ
ا Ø¢Ù Ø¨Ø³ÛØ§Ø± Ø¨ÙØªØ± است ک٠آÙÙØ§ ØµØ±ÛØØ§ ب٠عÙÙØ§Ù آرگÙÙ
ا٠پاس دÙÛÙ
Ø Ù
اÙÙØ¯ Ù
Ø«Ø§Ù Ø¨Ø§ÙØ§.
ج٠ع Ø¨ÙØ¯Û
ÙØ±Ø§Ø®ÙاÙÛ eval(code) رشت٠کد را اجرا Ù
Û Ú©ÙØ¯ Ù ÙØªÛج٠آخرÛ٠عÙ
ÙÛØ§Øª را بر Ù
Û Ú¯Ø±Ø¯Ø§ÙØ¯.
- Ø¨Ù ÙØ¯Ø±Øª در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù Ø¯Ø±Ù Ù ÙØ±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù است, ÚØ±Ø§Ú©Ù ٠ع٠ÙÙØ§ ÙÛØ§Ø²Û ب٠آ٠ÙÛØ³Øª.
- Ù Û ØªÙØ§Ùد ب٠٠تغÛÛØ± ÙØ§Û Ù ØÙÛ Ø®Ø§Ø±Ø¬Û Ø¯Ø³ØªØ±Ø³Û ÛØ§Ø¨Ø¯. Ú©Ù ÙØ§Ù ÙØ§Ø³Ø¨ در ÙØ¸Ø± Ú¯Ø±ÙØªÙ شدÙ.
- ب٠جاÛ
evalکد را در Ù ØÛØ· ع٠ÙÙ Û Ø§Ø¬Ø±Ø§ Ú©ÙÛØ¯ ٠ازwindow.eval(code)Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. - ÛØ§ اگر کد Ø´Ù
ا Ø¯Ø§Ø¯Ù ÙØ§ÛÛ Ø§Ø² Ù
ØÛØ· Ø®Ø§Ø±Ø¬Û ÙÛØ§Ø² دارد از
new FunctionØ§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯ ٠ب٠عÙÙØ§Ù آرگÙÙ Ø§Ù ÙØ§ ب٠آ٠پاس دÙÛØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)