+-
我如何对一个包含函数的字符串进行 "eval "操作?

在下面的例子中,我希望 bc = eval(a) 包含相同的函数,一个总是返回true的函数。然而, a 没有被执行,而是抛出一个语法错误。Uncaught SyntaxError: Function statements require a function name. 然而,如果如果给函数命名。c 包含 undefined.

var a = "function() { return true }";

var b = function() { return true };

var c = eval(a);

console.log(b,c);
2
投票

问题在于,你输入的代码是由 eval 语句的地方进行了评估,但您在 var b = 正在作为一个表达式进行评估。当解析器期望得到一个语句时,就会将 function 关键字启动功能 声明,它需要一个名称。但在需要表达式的地方, function 关键字启动功能 表情其中,名称是可选的。

要使您的 eval 而不是在表达式上工作,在代码周围加上 ():

var a = "function() { return true }";

var b = function() { return true };

var c = eval("(" + a + ")");
// −−−−−−−−−−^^^^^−−−^^^^^

console.log(b,c);

警告: 要非常小心使用 eval 并尽可能避免使用它。它的目的是从字符串中执行任意代码。如果你使用它,你会 必须 相信该字符串的来源是值得信赖的。千万不要从用户A处获取用户输入,然后 eval 除非用户B完全意识到发生了什么(例如,就像上面的堆栈片段--我是用户A,你是用户B;如果你点击运行按钮,你可能意识到代码会被运行)。事实上,在和非程序员打交道时,甚至不要在用户A的会话中评估用户A的代码。 :-)