将字符串作为一段HTML / javascript代码执行

时间:2016-04-22 11:48:45

标签: javascript html

所以,假设我在javascript中定义了一个字符串:

var c: ICustom = new Customizable();

如果我知道字符串的值,我可以执行代码吗?

如果是,那么我可以在字符串中包含多个命令吗?例如:

   var s = "function();"

提前致谢

3 个答案:

答案 0 :(得分:1)

您可以使用eval,并且会执行多个语句。 但是,使用eval通常是一个坏主意。在大多数情况下,如果没有eval,您可以完成任何尝试。

如果与用户提供的代码一起使用,

eval可能非常危险,例如来自表单或网址的内容。它会向您开放Cross-Site Scripting (XSS) attacks。只是避免它是最好的行动方式,正如this answer提到的那样,在通过eval之前对输入进行消毒并不是直截了当且非常容易出错。

使用eval时其他一些不那么重要的问题是它使代码难以调试而且速度很慢。它使得浏览器很难(如果不是不可能)像其他代码一样优化和/或缓存它。

<强>更新

我很惊讶我在最初回答此问题时忽略了这一点,但明确使用eval语句并不是在JavaScript中调用eval的唯一方法。将code instead of a function reference传递给setTimeoutsetInterval会隐式评估该代码。

// 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一样,在使用字符串作为setTimeoutsetIntervalFunction构造函数的输入时应小心,特别是如果用户输入将是传入他们。

另见:

答案 1 :(得分:0)

您可以使用eval()来评估/执行JavaScript代码/表达式:

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

答案 2 :(得分:0)

eval 函数将评估传递给它的字符串。 它。这是因为必须在现场解析要评估的代码,因此需要一些计算资源。