2009-06-02 69 views

回答

53

eval function将评估传递给它的字符串。

但是使用eval can be dangerous,所以慎用。

编辑: annakata好点 - 不仅是eval危险,它是。这是因为要评估的代码必须在现场解析,因此需要一些计算资源。

+24

超级危险的和缓慢的 - 你应该粗体,斜体,下划线和H1是 – annakata 2009-06-02 13:00:25

+4

我怀疑这是比任何页面时,必须被解析以及上加载JavaScript其他地方慢。如果速度较慢,那是因为它在不同的范围内完成,这可能会强制为该范围创建资源。 – cgp 2009-06-02 13:16:53

+2

如果你说`eval()`是危险的。有其他选择吗? – 2012-05-22 15:36:43

15

使用eval()。

W3 Schools tour of eval。网站有一些有用的eval例子。 The Mozilla documentation covers this in detail.

您可能需要get a lot of warnings以安全地使用它。 不允许用户将任何东西注入eval(),因为这是一个巨大的安全问题。

您还想知道eval()有不同的scope

+10

http://www.w3fools.com/。对于eval,W3C甚至没有什么可说的。如果你想链接到官方的东西,目标http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.1 – Bergi 2013-08-05 15:34:12

1

eval应该这样做。

eval(s); 
2
eval(s); 

但这可能是危险的,如果你是从用户获取数据,但我想,如果他们崩溃自己的浏览器那是他们的问题。

0
eval(s); 

请记住,该eval是非常强大和相当不安全。你最好确信你正在执行的脚本是安全的,并且是用户不可变的。

4

使用eval如下。应谨慎使用Eval,关于“eval is evil”的简单搜索应引起一些注意。

function ExecuteJavascriptString() 
{ 
    var s = "alert('hello')"; 
    eval(s); 
} 
8

试试这个:

var script = "<script type=\"text/javascript\"> content </script>"; 
    //using jquery next 
    $('body').append(script);//incorporates and executes inmediatelly 

个人而言,我没有测试它,但似乎工作。

88

您可以使用函数执行它。例如:

var theInstructions = "alert('Hello World'); var x = 100"; 

var F=new Function (theInstructions); 

return(F()); 
1

如果要执行特定的命令(即字符串)一个 具体时间 后 - CMD =你的代码 - 间隔=延时运行

function ExecStr(cmd, InterVal) { 
    try { 
     setTimeout(function() { 
      var F = new Function(cmd); 
      return (F()); 
     }, InterVal); 
    } catch (e) { } 
} 
//sample 
ExecStr("alert(20)",500); 
1

不知道这是欺骗或不:

window.say = function(a) { alert(a); }; 

var a = "say('hello')"; 

var p = /^([^(]*)\('([^']*)'\).*$/;     // ["say('hello')","say","hello"] 

var fn = window[p.exec(a)[1]];      // get function reference by name 

if(typeof(fn) === "function") 
    fn.apply(null, [p.exec(a)[2]]);     // call it with params 
3

经过这许多复杂和模糊的脚本:

var js = "alert('Hello, World!');" // put your JS code here 
var oScript = document.createElement("script"); 
var oScriptText = document.createTextNode(js); 
oScript.appendChild(oScriptText); 
document.body.appendChild(oScript); 
3

像什么@Hossein Hajizadeh alerady说了一下,但更详细:

还有就是eval()替代。

函数setTimeout()被设计为在毫秒的时间间隔后执行某些操作,并且要执行的代码恰好被格式化为字符串。

它的工作是这样的:

ExecuteJavascriptString(); //Just for running it 
 

 
function ExecuteJavascriptString() 
 
{ 
 
    var s = "alert('hello')"; 
 
    setTimeout(s, 1); 
 
}

1意味着它会等待1毫秒执行字符串之前。

它可能不是最正确的方法,但它的工作原理。

0

新功能和apply()协同工作,也

var a=new Function('alert(1);') 
a.apply(null) 
0

我回答类似的问题,并得到了另一种思路如何在不使用eval()实现这一目标:

const source = "alert('test')"; 
const el = document.createElement("script"); 
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' })); 
document.head.appendChild(el); 

基本上在上面的代码你创建包含脚本的Blob,以创建Object URL(在浏览器内存中表示File或Blob对象)。由于<script>标记上有src属性,因此脚本将以与从任何其他URL加载相同的方式执行。

0
function executeScript(source) { 
    var script = document.createElement("script"); 
    script.onload = script.onerror = function(){ this.remove(); }; 
    script.src = "data:text/plain;base64," + btoa(source); 
    document.body.appendChild(script); 
} 

executeScript("alert('Hello, World!');");