我怎样才能运行一个字符串,好像它在哪里javascript代码?

时间:2013-05-20 22:53:53

标签: javascript

如何运行字符串 好像它在哪里javascript代码?

//The user inputs javascript code and clicks run and it runs the javascript code

function getCode () {
    retrun code();
}

funciton runCode() {
    run(getCode());
}

5 个答案:

答案 0 :(得分:4)

您想要的功能是eval

function funCode() {
    eval(getCode());
};

答案 1 :(得分:3)

虽然eval()肯定有效,但另一个选择是获取代码,并将其传递给Function构造函数。这将创建一个以代码作为函数体的新函数。

这样做有一些好处。

  • 它的变量范围将是全局范围,因此您运行的代码不会干扰任何局部变量
  • 它有更好的表现
  • 您可以强制代码进入严格模式,并且可以隐藏windowself标识符,从而难以创建全局变量

funciton runCode() {
 // create `window` param---v         v--- and `self` param
    var f = new Function("window", "self", "  'use strict';  " + getCode())
                 // force strict mode -----------^
    var self = {}
    f.call(self, self, self); // pass an object to the `window` and `self` param
                              //   and set the same object as the `this` value
}

这肯定不能提供完全的安全性,但可以提供更多的“沙箱”来运行代码。

您还可以在调用后检查self对象,看它是否尝试创建任何全局变量。

将代码或函数执行包装在try/catch中,然后检查抛出的任何错误也可能很有用。

答案 2 :(得分:2)

您可以使用the built-in eval function

function runCode() {
    eval(getCode());
}

请注意,此功能有点“神奇”;解释器从周围的词汇上下文中提供信息。因此,必须将其称为eval;您无法设置run = eval,然后拨打run。 (但是,你可以写function run(s) { return eval(s); }。)

答案 3 :(得分:2)

eval()是您正在寻找的功能。

但是明智地使用它或者根本不使用它,因为它充满了安全风险。

var exec_string = 'alert(\'Hello, World!\')';
eval(exec_string);
  
    

输出“Hello,World!”在警报

  

答案 4 :(得分:1)

正如其他海报所指出的那样,eval是为此目的而存在的方法。但是,eval将执行任何javascript代码,无论其是否有害(例如来自第三方来源的javascript可能具有无限循环,或者更糟糕的是恶意行为)。有共同的副词

eval == evil

因此 eval通常被视为反模式。然而,采取这种简单的方法是错误的。相反,在您希望评估的字符串可以信任的情况下使用eval是完全可以接受的。然而事实证明,这种情况相对较少。显然,来自第三方网站的任何内容都是危险的(即使您信任所有者,他们也可能被黑客入侵)。即使从你自己的服务器,你也可能容易受到“中间人”的攻击,尽管这对大多数网站来说都是不太可能的。

需要评估javascript字符串的最常见原因是呈现第三方网页。在这种情况下,通常最好在服务器上呈现页面(例如http://phantomjs.org/),然后将结果发送到浏览器。这样可以防止浏览器运行不安全的代码。

另一个越来越常见的用例是交互式教程网站,用户可以在其中查看他们输入的代码的结果。在这种情况下,您不再担心恶意脚本,因为用户将遭受的唯一恶意脚本是那些他/她打字的人。但在这种情况下,您仍然担心会破坏您网站功能的错误(例如无限循环),因此仍建议您在服务器上执行评估(使用适当的安全措施),以便输入的javascript不会破坏任何内容。

eval的另一种可能替代方法是Google的cajahttps://code.google.com/p/google-caja/),它打算解决所有这些问题,但我自己从未使用它,也无法对其有用性发表评论。