我有一个字符串方法,例如:
var str = "function evalTest(param){if(param)return '<div>hello</div>'}else return '<div>world</div>'"
我正在替换参数,例如:
var res = str.replace("param", "param=false");
现在,如果我像这样进行评估:
var final = eval(res);
我期望最终应该包含结果“world”,因为传递了 param = false。
如何实现“世界”这个结果?
最佳答案
首先需要注意的是:几乎可以肯定,通过在字符串中使用该函数来解决您试图解决的任何问题,都有更好的解决方案。
还有一个:除了同一最终用户之外,切勿评估
由最终用户提供的代码。例如,切勿让用户 A 提供代码,然后在用户 B 的浏览器中评估
它。 (用户 B 不知道您正在这样做并明确同意。)
实际上,几乎每次您使用 eval
(或其表亲 new Function
)时,都值得退一步看看是否还有其他方法可以使用。
但回答所提出的问题:
eval
只是创建函数。该字符串中没有任何调用它的内容。
因为 eval
在当前作用域中神奇地工作,所以对字符串进行 eval
操作会在当前作用域中创建函数。然后,您可以调用您的函数来获取您正在寻找的结果:
var str = "function evalTest(param){if(param){return '<div>hello</div>'}else {return '<div>world</div>'}}";
var res = str.replace("param", "param=false");
eval(res);
var final = evalTest();
console.log(final);
请注意,我修复了函数文本中的几个语法错误(主要是大括号问题)。
如果您不想在当前作用域中定义该函数,可以修改字符串使其成为函数表达式并立即调用:
var str = "function evalTest(param){if(param){return '<div>hello</div>'}else {return '<div>world</div>'}}";
var res = str.replace("param", "param=false");
var final = eval("(" + res + ")()");
console.log(final);
关于javascript - 如何在javascript中评估字符串函数并返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872963/