我有一个类似字符串的方法:
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);
我期望final应该包含结果“ world”,因为传递的param = false。
如何实现这个结果“世界”?
答案 0 :(得分:1)
首先警告:通过在字符串中包含该函数,几乎可以肯定会找到一种更好的解决方案。
还有另一个::除同一终端用户外,终端用户不得提供eval
代码。例如,切勿让用户A提供代码,而后在用户B的浏览器中eval
。 (没有用户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);