2016-04-22 60 views
1

因此,可以说我在JavaScript中定义的字符串:执行字符串作为一块的HTML/JavaScript代码

var s = "function();" 

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

如果是,那么我可以在一个字符串内有多个命令吗?例如:

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

在此先感谢

+0

使用'的eval()'... [检查这里](https://developer.mozilla.org/en-US/docs/We B/JavaScript的/参考/ Global_Objects/EVAL)... –

回答

1

您可以使用eval,并且会执行多条语句。 但是,使用eval通常是一个坏主意。在大多数情况下,您可能可以完成任何您试图做的事情,而不需要eval

eval如果与用户提供的代码一起使用(如来自表单或URL的内容),则可能会相当危险。它打开你达Cross-Site Scripting (XSS) attacks。只是避免它是最好的行动方式,因为this answer提到,在将其输入eval之前对输入进行消毒不是直截了当,而且很容易出错。

使用eval时出现的其他几个不太重要的问题是它使代码难以调试,而且速度很慢。如果浏览器不像其他代码那样对其进行优化和/或缓存,它也很难实现。

更新

我很惊讶,我忘了提及这个,当我最初回答了这一点,但明确地使用eval说法是不是唯一的方法eval在JavaScript调用。通过code instead of a function referencesetTimeoutsetInterval将隐式评估该代码。

// 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构造,特别是当用户输入将被传递到上当。

另见:

0

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

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

0

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