用户输入带有变量声明的 JavaScript eval

sag*_*e88 2 javascript firebug command-line eval

作为家庭作业的一部分,我试图在浏览器环境中实现一个类似于 Firebug 中可用的 JavaScript 控制台。从我收集到的情况来看,eval()这似乎是最简单的方法。然而,即使是非常基本的用户输入,我的代码也会遇到一些问题。例如:

\n\n
var number = 5;\n
Run Code Online (Sandbox Code Playgroud)\n\n

导致语法错误而不仅仅是评估undefined像 Firebug 中那样进行评估。因此,我似乎根本无法在 eval 字符串内声明变量。如果我做一些更简单的事情,例如:

\n\n
3 + 4 * Math.PI\n
Run Code Online (Sandbox Code Playgroud)\n\n

它工作正常。我试图找到一个有人使用的例子eval()在包含变量声明的字符串上使用的示例,但我似乎找不到任何人这样做。

\n\n

在将用户输入编译成新字符串之前,我是否需要使用正则表达式完全解析用户输入eval()

\n\n

能把eval()分号理解为换行符吗?我也找不到使用这些的人。

\n\n
function runMiniFirebug() {\n    var userInput = document.getElementById("user-input").value;\n    try {\n        var userOutput = eval(\'(\' + userInput + \')\');\n        document.getElementById("js-output").innerHTML += \'<p class="input">>>>\' + userInput + \'<p>\';\n        document.getElementById("js-output").innerHTML += \'<p class="ouput">\' + userOutput + \'<p>\';\n    }\n    catch(error) {\n        document.getElementById("js-output").innerHTML += \'<p class="input">>>>\' + userInput + \'<p>\';\n        document.getElementById("js-output").innerHTML += \'<p class="error">\' + error.message + \'<p>\';\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:\n所以看来添加的括号导致了错误。这是我的讲师幻灯片中的一部​​分。该信息是否不正确,或者我只是错误地解释了它?

\n\n
\n

用 { ... } 分隔的字符串

\n\n

\xe2\x80\x93 您必须添加额外的括号,以便 JavaScript 知道 \n 大括号用于对象文字,而不是用于分隔语句。

\n\n

\xe2\x80\xa2 这样做没什么坏处,所以定期添加括号

\n\n

\xe2\x80\x93 var test2 = "{ 名字:\'杰伊\', 姓氏:\'萨恩\' }";

\n\n

\xe2\x80\x93 var person = eval("(" + test2 + ")");

\n
\n

Doo*_*nob 6

var userOutput = eval('(' + userInput + ')');
Run Code Online (Sandbox Code Playgroud)

为什么要用括号括起来?这将创建语句

(var number = 5;)
Run Code Online (Sandbox Code Playgroud)

这是无效的语法。

只需删除'(' ++ ')'


至于您的编辑,这是指仅评估单个表达式var number = 5;不是一个表达式,也不是alert(1 + 1); alert(2 + 2);。将其中任何一个括在括号中都会导致错误。