首页 > 解决方案 > 如何对包含函数的字符串执行“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);

标签: javascripteval

解决方案


问题是您输入的代码正在eval预期的语句处被评估,但您之后的代码var b =被评估为表达式。当解析器期待一个语句时,function关键字开始一个函数声明,它需要一个名称。但是在需要表达式的地方,function关键字会启动一个函数表达式,其中名称是可选的。

eval改为使用表达式,请将代码用(and括起来)

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

var b = function() { return true };

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

console.log(b,c);


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


推荐阅读