如果您确实需要更改范围(即创建REPL),可以替换with
语句。
我尝试过类似的事情:
function evalInScope( scope, code ) {
let
keys = scope.keys(),
values = keys.map(it => scope[it]),
fn = eval(`new Function( ${ keys.map(key => '"' + key + '"').join(',') }, " return (${ code })") `);
return fn.apply(context, values);
}
但这似乎不是最佳解决方案