0

我的目标是编写一个 javascript 应用程序,它将文本作为输入并将该文本编译/运行为代码。

例如,假设 JS 应用程序有一个可以变成红色或绿色的灯。用户输入的文本可以将lightRed();其变为红色,并将lightGreen();其变为绿色。我认为解决这类问题的标准方法是实现某种词法分析器/解析器,就像Jison所做的那样。

然而,我对 JS 编程还很陌生,这似乎是一项艰巨的任务——尤其是当我后来计划向它添加更复杂的功能时,比如 if/else 语句。所以我想知道是否可以将输入的文本视为 javascript,本质上是使用浏览器处理 javascript 的能力。所以 javascript 应用程序将有一个灯,它会有名为 lightRed() 和 lightGreen() 的函数。输入到 javascript 的文本将被视为 javascript,因此将 lightRed() 编写为文本将直接执行应用程序中的 lightRed() 函数。这可能吗?这会比只使用 Jison 之类的东西更复杂吗?谢谢!

4

2 回答 2

6

编译输入的 JavaScript 最简单的方法是使用eval 函数。这将评估并执行作为字符串传入的任何代码。

例子:

eval(document.getElementById('code').value)

JSFiddle

请注意,尽管这确实使用户有可能不受限制地执行他想要的任何代码,因此在允许这样做之前请仔细考虑。

为了帮助减轻任何安全风险,您可以在全局范围内执行代码,如this answer所示,防止代码访问您的任何局部变量,这就像用户从浏览器的开发人员那里运行代码一样安慰。

更安全的例子:

(function(){eval.apply(this,[document.getElementById('code').value])})()

更安全的 JSFiddle

于 2013-08-09T16:24:26.343 回答
1

eval()将字符串表达式评估为 JavaScript。大多数人(包括我自己)都会警告您有关安全漏洞的信息;但是如果您考虑一下,用户可以打开 javascript 控制台并输入并运行所有相同的代码。所以去吧 :)

于 2013-08-09T16:25:17.517 回答