给定一个任意的 eval()
有什么方法可以将其转换为使用 new Function()
而不破坏与任何输入的兼容性(除了范围的变化)?
我能想到的唯一问题是,eval允许多条语句,并返回最后一条语句的结果,而不需要添加一个显式的 return
. 我想不出有什么办法可以仿效这一点。new Function()
:
let code = '4; 5'
> eval(code);
5
> new Function(code)();
undefined
> new Function('return ' + code)();
4
> new Function('return (' + code + ')')();
SyntaxError: Unexpected token ;
是我遗漏了什么,还是 eval()
不符合 new Function()
在这种情况下?
不,这在 Function()
. 该 eval
函数是唯一一个考虑到语句结果的JavaScript功能。
new Function()确实可以处理多个语句......但它只能对本地变量和传递到它的变量进行操作......这意味着你只能返回一个结果。
var outerVar1 = 2;
var outerVar2 = 3;
var newFunc = new Function('a1','a2', 'var result = a1 * a2; return(result);');
console.log('Result = ' + newFunc(outerVar1, outerVar2));
上面的能用,下面的不能用......至少在大多数引擎中是这样......。
var outerVar1 = 2;
var outerVar2 = 3;
var newFunc = new Function('var result = outerVar1 * outerVar2; return(result);');
console.log('Result = ' + newFunc());