所以,假设我在javascript中定义了一个字符串:
var c: ICustom = new Customizable();
如果我知道字符串的值,我可以执行代码吗?
如果是,那么我可以在字符串中包含多个命令吗?例如:
var s = "function();"
提前致谢
答案 0 :(得分:1)
您可以使用eval
,并且会执行多个语句。 但是,使用eval
通常是一个坏主意。在大多数情况下,如果没有eval
,您可以完成任何尝试。
eval
可能非常危险,例如来自表单或网址的内容。它会向您开放Cross-Site Scripting (XSS) attacks。只是避免它是最好的行动方式,正如this answer提到的那样,在通过eval
之前对输入进行消毒并不是直截了当且非常容易出错。
使用eval
时其他一些不那么重要的问题是它使代码难以调试而且速度很慢。它使得浏览器很难(如果不是不可能)像其他代码一样优化和/或缓存它。
<强>更新强>
我很惊讶我在最初回答此问题时忽略了这一点,但明确使用eval
语句并不是在JavaScript中调用eval
的唯一方法。将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
构造函数的输入时应小心,特别是如果用户输入将是传入他们。
另见:
答案 1 :(得分:0)
您可以使用eval()
来评估/执行JavaScript代码/表达式:
var k = "var a = 0; alert(a); a = a + 1; alert(a);"
eval(k);
&#13;
答案 2 :(得分:0)
eval
函数将评估传递给它的字符串。
它慢。这是因为必须在现场解析要评估的代码,因此需要一些计算资源。