Baseline Widely available
ÐÑедÑпÑеждение: ÐÑполнение кода JavaScript Ñ ÑекÑÑовой ÑÑÑоки - ÑÑо невеÑоÑÑнÑй ÑиÑк Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи. ÐлоÑмÑÑÐ»ÐµÐ½Ð½Ð¸ÐºÑ ÑлиÑком легко запÑÑÑиÑÑ ÐºÐ°ÐºÐ¾Ð¹ Ñгодно код, когда Ð²Ñ Ð¸ÑполÑзÑеÑе eval()
. СмоÑÑиÑе Ðикогда не иÑполÑзÑйÑе eval()!, ниже.
ÐеÑод eval()
вÑполнÑÐµÑ JavaScript-код, пÑедÑÑавленнÑй ÑÑÑокой.
console.log(eval("2 + 2"));
// Expected output: 4
console.log(eval(new String("2 + 2")));
// Expected output: 2 + 2
console.log(eval("2 + 2") === eval("4"));
// Expected output: true
console.log(eval("2 + 2") === eval(new String("2 + 2")));
// Expected output: false
СинÑакÑÐ¸Ñ ÐаÑамеÑÑÑ
string
СÑÑока, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ JavaScript вÑÑажением, опеÑаÑоÑом или поÑледоваÑелÑноÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑÑажение Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÐµÑеменнÑе и ÑвойÑÑва ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¾Ð±ÑекÑов.
ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°, пеÑеданного в ÑÑнкÑÐ¸Ñ Ð² виде ÑÑÑоки. ÐÑли код не возвÑаÑÐ°ÐµÑ Ð½Ð¸Ñего - бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено знаÑение undefined
.
eval()
- ÑÑнкÑÐ¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного обÑекÑа.
ÐÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии eval()
- ÑÑÑока. eval()
иÑполнÑÐµÑ ÑодеÑжаÑееÑÑ Ð² ÑÑÑоке вÑÑажение, один или неÑколÑко опеÑаÑоÑов JavaScript. Ðе ÑÑÐ¾Ð¸Ñ Ð²ÑзÑваÑÑ eval()
Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°ÑиÑмеÑиÑеÑкого вÑÑажениÑ; JavaScript вÑÑиÑлÑÐµÑ Ð¸Ñ
авÑомаÑиÑеÑки.
eval()
можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°ÑиÑмеÑиÑеÑкого вÑÑажениÑ, запиÑанного в ÑÑÑоковом виде, на более поздней ÑÑадии иÑполнениÑ. ÐÑедположим, ÑÑÑеÑÑвÑÐµÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ x
. Ðожно оÑложиÑÑ Ð²ÑÑиÑление вÑÑажениÑ, в коÑоÑом ÑодеÑжиÑÑÑ Ñ
, еÑли пÑиÑвоиÑÑ Ð¿ÐµÑеменной ÑÑо вÑÑажение в виде ÑÑÑоки (допÑÑÑим, "3 * x + 2
"), а заÑем вÑзваÑÑ eval()
в более поздней ÑоÑке кода.
ÐÑли аÑгÑменÑ, пеÑеданнÑй eval()
, не ÑвлÑеÑÑÑ ÑÑÑокой, eval()
возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾ неизменнÑм. Ð ÑледÑÑÑем пÑимеÑе опÑеделÑн конÑÑÑÑкÑÐ¾Ñ String
, и eval()
не вÑÑиÑлÑÐµÑ Ð·Ð½Ð°Ñение вÑÑажениÑ, запиÑанного в ÑÑÑоковом виде, а возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ñипа String
.
eval(new String("2 + 2")); // возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ñипа String, ÑодеÑжаÑий "2 + 2"
eval("2 + 2"); // возвÑаÑÐ°ÐµÑ 4
ÐÑо огÑаниÑение легко обойÑи пÑи помоÑи toString()
.
var expression = new String("2 + 2");
eval(expression.toString());
ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе eval
коÑвенно, вÑзовом его ÑеÑез ÑÑÑлкÑ, а не пÑоÑÑо eval
, в ECMAScript 5 ÑÑо ÑабоÑÐ°ÐµÑ Ð² глобалÑной облаÑÑи видимоÑÑи, а не в локалÑной; ÑÑо знаÑиÑ, ÑÑо eval
бÑÐ´ÐµÑ Ð²Ñзван в глобалÑной облаÑÑи видимоÑÑи, а код бÑÐ´ÐµÑ Ð²Ñполнен Ñ Ð¾ÑÑÑÑÑÑвием доÑÑÑпа к локалÑнÑм пеÑеменнÑм в пÑеделаÑ
облаÑÑи видимоÑÑи, где он бÑл вÑзван.
function test() {
var x = 2,
y = 4;
console.log(eval("x + y")); // ÐÑÑмой вÑзов, иÑполÑзÑÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑи видимоÑÑи, ÑезÑлÑÑÐ°Ñ - 6
var geval = eval;
console.log(geval("x + y")); // ÐепÑÑмой вÑзов, иÑполÑзÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, бÑоÑÐ¸Ñ ReferenceError, Ñ.к. `x` - не опÑеделÑн
}
Ðе иÑполÑзÑйÑе eval без необÑ
одимоÑÑи!
eval()
- опаÑÐ½Ð°Ñ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑполнÑÐµÑ ÐºÐ¾Ð´, пÑоÑ
одÑÑий Ñо вÑеми пÑивилегиÑми вÑзÑваÑелÑ. ÐÑли Ð²Ñ Ð·Ð°Ð¿ÑÑкаеÑе eval()
Ñо ÑÑÑокой, на коÑоÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð²Ð»Ð¸ÑÑÑ Ð·Ð»Ð¾ÑмÑÑленники, Ñо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе запÑÑÑиÑÑ Ð²ÑедоноÑнÑй код на ÑÑÑÑойÑÑво полÑзоваÑÐµÐ»Ñ Ñ Ð¿Ñавами ваÑей веб-ÑÑÑаниÑÑ/ÑаÑÑиÑениÑ. Ðаиболее важно, код ÑÑеÑÑей ÑÑоÑÐ¾Ð½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, в коÑоÑой бÑл вÑзван eval()
, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к аÑакам, поÑ
ожим на Function
.
Также eval()
, как пÑавило, медленнее алÑÑеÑнаÑив, Ñак как вÑзÑÐ²Ð°ÐµÑ Ð¸Ð½ÑеÑпÑеÑаÑÐ¾Ñ JS, Ñогда как многие дÑÑгие конÑÑÑÑкÑии опÑимизиÑÐ¾Ð²Ð°Ð½Ñ ÑовÑеменнÑми JS движками.
ÐÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑе (и бÑÑÑÑÑе!) алÑÑеÑнаÑÐ¸Ð²Ñ eval()
Ð´Ð»Ñ Ð¾Ð±ÑиÑ
ÑлÑÑаев иÑполÑзованиÑ.
Ðам не ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ eval()
, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð½Ð²ÐµÑÑиÑоваÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑвойÑÑв в ÑвойÑÑва. РаÑÑмаÑÑÐ¸Ð²Ð°Ñ ÑледÑÑÑий пÑимеÑ, где ÑвойÑÑво обÑекÑа иÑполÑзÑемое Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа неизвеÑÑно до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. ÐÑо можно ÑделаÑÑ Ñ eval:
var obj = { a: 20, b: 30 };
var propname = getPropName(); // возвÑаÑÐ°ÐµÑ "a" или "b"
eval("var result = obj." + propname);
Ðднако, eval()
здеÑÑ Ð½Ðµ нÑжен. Ðо ÑакÑÑ, иÑполÑзование здеÑÑ ÐµÐ³Ð¾ ÑдивлÑеÑ. ÐмеÑÑо него иÑполÑзÑйÑе доÑÑÑп к ÑвойÑÑвам, коÑоÑÑй бÑÑÑÑее и безопаÑнее:
var obj = { a: 20, b: 30 };
var propname = getPropName(); // возвÑаÑÐ°ÐµÑ "a" или "b"
var result = obj[propname]; // obj[ "a" ] Ñо же, ÑÑо и obj.a
ÐÑполÑзÑйÑе ÑÑнкÑии вмеÑÑо иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑагменÑов кода
У JavaScript ÑÑнкÑии пеÑвого клаÑÑа, ÑÑо знаÑиÑ, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаваÑÑ ÑÑнкÑии как аÑгÑменÑÑ, Ñ ÑаниÑÑ Ð¸Ñ Ð² пеÑеменнÑÑ Ð¸Ð»Ð¸ ÑвойÑÑÐ²Ð°Ñ Ð¾Ð±ÑекÑов и Ñак далее. Ðногие DOM API ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ñ ÑÑÑÑом ÑÑого, Ñак ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе (и вам ÑледÑеÑ) пиÑаÑÑ:
// вмеÑÑо setTimeout(" ... ", 1000) :
setTimeout(function() { ... }, 1000);
// вмеÑÑо elt.setAttribute("onclick", "...") иÑполÑзоваÑÑ:
elt.addEventListener("click", function() { ... } , false);
ÐамÑÐºÐ°Ð½Ð¸Ñ Ñакже Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ ÐºÐ°Ðº ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑий Ñ Ð¿Ð°ÑамеÑÑами без конкаÑенаÑии ÑÑÑок.
Ð Ð°Ð·Ð±Ð¾Ñ JSON (конвеÑÑиÑование ÑÑÑок в JavaScript обÑекÑÑ)ÐÑли ÑÑÑока, пеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ Ð² eval()
, ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе (к пÑимеÑÑ, маÑÑив: "[1, 2, 3]"
), а не код, вам ÑледÑÐµÑ ÑаÑÑмоÑÑеÑÑ JSON, позволÑÑÑий ÑÑÑоке иÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво JavaScript ÑинÑакÑиÑа Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
. СмоÑÑиÑе Ñакже: ÐагÑÑзка JSON и JavaScript в ÑаÑÑиÑениÑÑ
.
ÐамеÑÑÑе, ÑÑо ÑинÑакÑÐ¸Ñ JSON огÑаниÑен в ÑÑавнении Ñ JavaScript ÑинÑакÑиÑом, многие валиднÑе JavaScript лиÑеÑÐ°Ð»Ñ Ð½Ðµ ÑаÑпаÑÑÑÑÑÑ Ð² JSON. РпÑимеÑÑ, лиÑние запÑÑÑе в конÑе вÑÑажений не ÑазÑеÑÐµÐ½Ñ Ð² JSON, а имена ÑвойÑÑв (клÑÑи) в обÑекÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð² двойнÑÑ ÐºÐ°Ð²ÑÑÐºÐ°Ñ . ÐÑдÑÑе ÑвеÑÐµÐ½Ñ Ð¸ÑполÑзоваÑÑ ÑеÑиализаÑÐ¸Ñ JSON Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑÑок, коÑоÑÑе поÑом бÑдÑÑ ÑазбиÑаÑÑÑÑ ÐºÐ°Ðº JSON.
ÐеÑедавайÑе даннÑе вмеÑÑо кодаРпÑимеÑÑ, ÑаÑÑиÑение, Ñозданное изменÑÑÑ ÑодеÑжимое веб-ÑÑÑаниÑ, должно имеÑÑ Ð¿Ñавила, опÑеделÑннÑе в XPath, а не JS коде.
ÐÑполнÑйÑе код Ñ Ð¾Ð³ÑаниÑеннÑми пÑавамиÐÑли вÑполнÑÑÑ ÐºÐ¾Ð´ вÑÑ-Ñаки Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, желаÑелÑно ÑÑо делаÑÑ Ñ ÑменÑÑеннÑми пÑивелегиÑми. ÐÑÐ¾Ñ ÑÐ¾Ð²ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ, главнÑм обÑазом, к ÑаÑÑиÑениÑм и XUL пÑиложениÑм, коÑоÑÑе могÑÑ Ð¸ÑполÑзоваÑÑ Components.utils.evalInSandbox.
ÐÑимеÑÑ ÐÑполÑзованиеeval
Ð ÑледÑÑÑем коде оба вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑÐ¶Ð°Ñ eval()
, возвÑаÑаÑÑий 42. ÐеÑвое опÑеделÑеÑÑÑ ÑÑÑокой "x + y + 1
"; вÑоÑое - ÑÑÑокой "42
".
var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // возвÑаÑÐ°ÐµÑ 42
eval(z); // веÑнÑÑ 42
ÐÑполÑзование eval
Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÑоки, ÑодеÑжаÑей опеÑаÑоÑÑ JavaScript
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÐµÑ eval()
Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ str
. ÐÑа ÑÑÑока ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· JavaScript вÑÑажений, пеÑаÑаÑÑиÑ
в конÑолÑ, и, еÑли x Ñавен пÑÑи, пÑизÑваÑÑиÑ
z знаÑение 42, или 0 в пÑоÑивном ÑлÑÑае. Ðогда вÑоÑое вÑÑажение бÑÐ´ÐµÑ Ð¸Ñполнено, eval()
бÑÐ´ÐµÑ ÑÑиÑаÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑполненнÑми, а Ñакже ÑÑо ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð·Ð½Ð°Ñение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной z и веÑнÑÑ ÐµÐ³Ð¾.
var x = 5;
var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0; ";
console.log("z is ", eval(str));
ÐоÑледнее вÑÑажение вÑполнÑеÑÑÑ
eval()
веÑнÑÑ Ð·Ð½Ð°Ñение поÑледнего вÑполнÑемого вÑÑажениÑ
var str = "if ( a ) { 1+1; } else { 1+2; }";
var a = true;
var b = eval(str); // веÑнÑÑ 2
console.log("b is : " + b);
a = false;
b = eval(str); // веÑнÑÑ 3
console.log("b is : " + b);
eval
как ÑÑÑоковое опÑеделение ÑÑнкÑии, вклÑÑаÑÑее "(" и ")" как пÑеÑÐ¸ÐºÑ Ð¸ ÑÑÑÑикÑ
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // веÑнÑÑ undefined
var fct2 = eval(fctStr2); // веÑнÑÑ ÑÑнкÑиÑ
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами Gecko-ÑпеÑиÑиÑнÑе замеÑаниÑ
eval()
имел вÑоÑой необÑзаÑелÑнÑй аÑгÑменÑ, ÑказÑваÑÑий на Ñо, в конÑекÑÑе какого обÑекÑа бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð²ÑÑажение. ÐÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð½Ðµ бÑл ÑÑандаÑÑизован и бÑл ÑдалÑн из SpiderMonkey в Gecko 1.9.1 (Firefox 3.5). См. Firefox bug 442333.RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4