执行存储为字符串的JavaScript代码

div*_*nci 154 javascript

如何执行一些字符串的JavaScript?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}
Run Code Online (Sandbox Code Playgroud)

Len*_*ann 207

eval("my script here")功能.

  • 小心点 !这将执行代码,因此要小心你在哪里/如何得到这个字符串.请注意,任何人都可能尝试在您的字符串中插入恶意代码. (6认同)
  • @divinci 这称为“跨站点脚本”。请参见此处:https://en.wikipedia.org/wiki/Cross-site_scripting。 (2认同)

小智 117

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

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

var F=new Function (theInstructions);

return(F());
Run Code Online (Sandbox Code Playgroud)

  • 是和否:使用eval代码也会执行,而在F()之前不执行Function()代码(用例?检查语法错误但不想执行代码) (10认同)
  • 但最终 - 这与调用 `var F=function(){eval(theInstructions);};` 不一样吗? (3认同)
  • @stefan它是beatifull ...`new Function("alert('Hello World');")()` (2认同)
  • 我在 try/catch 块中尝试了这个,它工作得很好。我现在可以将任何输入到文本块中的 JavaScript 代码传递给我的函数并执行它。然后,catch 块可以将来自 JavaScript 引擎的错误消息插入到 DOM 元素中,并显示代码中的任何错误。如果有人想要我写的函数,那么我把它整理好后,就可以发布在这里。 (2认同)

coo*_*ird 60

eval函数将评估传递给它的字符串.

但使用eval可能很危险,所以要谨慎使用.

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

  • 超级危险和慢 - 你应该大胆,斜体,下划线,和那个 (32认同)
  • 我怀疑它比在页面上的任何其他位置加载JavaScript要慢,这也必须进行解析.如果它更慢,那是因为它是在不同的范围内完成的,这可能会迫使为该范围创建资源. (5认同)
  • 如果你说`eval()`很危险.还有其他选择吗? (5认同)
  • 如果您的安全性完全取决于客户端javascript,则您已经花了很多时间,而与eval无关。 (5认同)
  • @coobird我知道这有点晚了,但为什么那么危险?用户可以使用控制台轻松地在您的网站上运行JavaScript代码. (4认同)
  • 危险的部分不是用户在其机器上执行代码。它是用户执行他人代码的用户。 (2认同)

cgp*_*cgp 20

使用eval().

W3学校游览eval.网站有一些可用的eval示例.Mozilla文档详细介绍了这一点.

您可能会收到很多关于安全使用它的警告.不允许用户将任何内容注入eval(),因为它是一个巨大的安全问题.

您还需要知道eval()具有不同的范围.

  • http://www.w3fools.com/.W3C甚至没有任何关于eval的说法.如果你想链接到官方的东西,请定位http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.1 (11认同)
  • 我不想"链接到任何官方的东西,我想链接到可读的东西 - 看看你链接的是什么,它没有解释它是如何使用的,没有例子,没有办法修补,并描述了方法对于初学者来说,这是一个完全不恰当的联系.嘿,你不会碰巧是@bjorninge,对吗? (7认同)

小智 15

试试这个:

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

我个人没有测试它,但似乎工作.

  • 为什么你需要逃避结束 &gt; ? (3认同)

Eri*_*thi 14

对于使用 node 并且关心eval()nodejs 提供的上下文影响的用户vm。它创建了一个 V8 虚拟机,可以在单独的上下文中沙箱化您的代码的执行。

更进一步的是vm2,这会加强vm允许 vm 运行不受信任的代码。

const vm = require('vm');

const x = 1;

const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.

const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);

console.log(sandbox.x); // 42
console.log(sandbox.y); // 17

console.log(x); // 1; y is not defined.
Run Code Online (Sandbox Code Playgroud)

  • 与其说“eval 是邪恶的”并且没有给出任何上下文或解决方案,而是实际上试图解决问题。+1 给你 (5认同)

Ant*_*ber 10

有点像@Hossein Hajizadeh alerady所说的,尽管更详细:

有另一种选择eval().

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

它会像这样工作:

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}
Run Code Online (Sandbox Code Playgroud)

1 意味着它将在执行字符串之前等待1毫秒.

它可能不是最正确的方法,但它确实有效.

  • 当你可以将 0(零)传递给“setTimeout”时,为什么要浪费一毫秒呢?请注意,无论如何它都会使执行异步。这意味着“setTimeout”调用之后的所有代码都将在传递给“setTimeout”的代码之前被调用(即使使用 0(零)调用)。 (3认同)

xk0*_*der 7

使用eval如下.Eval应该谨慎使用,关于" eval is evil " 的简单搜索应该引出一些指示.

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    eval(s);
}
Run Code Online (Sandbox Code Playgroud)

  • *关于“评估是邪恶的”的简单搜索*的好提示*谢谢! (2认同)

Rei*_*ner 6

New Function 和apply()也可以一起使用

var a=new Function('alert(1);')
a.apply(null)
Run Code Online (Sandbox Code Playgroud)


Hos*_*deh 5

如果要在特定时间后执行特定命令(即字符串) - cmd =您的代码 - InterVal =延迟运行

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

  • 为什么“InterVal”中的“Val”大写? (3认同)

rli*_*lib 5

在许多复杂且模糊的脚本上进行了检查:

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);
Run Code Online (Sandbox Code Playgroud)


akr*_*krn 5

我正在回答类似的问题,并得到了另一个想法如何在不使用的情况下实现这一目标eval()

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

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


小智 5

new Function('alert("Hello")')();
Run Code Online (Sandbox Code Playgroud)

我认为这是最好的方法。

  • 为什么你认为这是最好的方法? (3认同)
  • 这是 eval 最简洁的替代方案,eval 通常被认为是不安全的,正如这里大多数答案中所解释的那样。 (2认同)