2016-04-22 5 views
1

Итак, предположим, что у меня есть строка, определенные в JavaScript:Выполнить строку как часть HTML/JavaScript код

var s = "function();" 

Могу ли я выполнить код, если я знаю, что значение строки?

И если да, то могу ли я иметь несколько команд внутри строки? Например:

var k = "function(); a = a + 1;" 

Заранее спасибо

+0

Используйте 'Eval()' ... [проверка здесь] (https://developer.mozilla.org/en-US/docs/We б/JavaScript/Справка/Global_Objects/Eval) ... –

ответ

1

Вы можете использовать eval, и да будет выполнено несколько операторов. НО, как правило, плохая идея использовать eval. В большинстве случаев вы, вероятно, можете выполнить все, что хотите, без eval.

eval может быть довольно опасным, если используется с кодом пользователя, например, от формы или URL-адреса. Он откроет вас до Cross-Site Scripting (XSS) attacks. Просто избегая этого, это лучший способ действий, так как this answer упоминает, дезинфицируя входные данные перед тем, как пронести его через eval, совсем нет прямой и очень подверженной ошибкам.

Пара других менее важных проблем с использованием eval заключается в том, что он делает код сложным для отладки, и он медленный. Это делает невозможным оптимизацию и/или кеширование браузерами, как это делает другой код.

Update

Я удивлен, что я забыл упомянуть об этом, когда я первоначально это ответил, но явно с помощью eval заявления не является единственным способом eval может быть использован в JavaScript. Передача code instead of a function reference на setTimeout или setInterval будет неявно определять этот код.

// This evals: 
setTimeout("doSomething()", 1000); 
// This does not eval: 
setTimeout(doSomething, 1000); // also shorter :) 

Хотя не совсем такой же, как eval, то Function constructor также similar security concerns associated with it.

let xss = 'alert("XSS")'; 
 

 
// whatever is in the string passed to Function 
 
// becomes the body of the function 
 
let doSomething = new Function(xss); 
 

 
document.querySelector('button').addEventListener('click', doSomething, false);
<button>Do Something</button>

Так же, как с eval, следует соблюдать осторожность при использовании строки в качестве входных данных для setTimeout, setInterval или Function конструктора, особенно если пользовательский ввод будет передаваться в них.

Также смотрите:

0

Вы можете использовать eval() для оценки/Выполнение JavaScript кода/выражения:

var k = "var a = 0; alert(a); a = a + 1; alert(a);" 
 
eval(k);

0

evalфункция будет оценивать строка, которая передается ему. Это slow. Это связано с тем, что код, который нужно оценить, должен анализироваться на месте, так что это потребует некоторых вычислительных ресурсов.