This code works optimally and is easily comprehensible:
function evalInScope(js, contextAsScope) {
//# Return the results of the in-line anonymous function we .call with the passed context
return function() {
with(this) {
return eval(js);
};
}.call(contextAsScope);
}
evalInScope("a + b", {a: 1, b: 2}); // 3 obviously, but fails in strict mode!
However, the "smart" brains decided to remove the with
statement without a proper replacement.
Question: how to make it work again in ES6, which is automatically in strict mode?
2
Answers
The problem is that you’re trying to do something that strict mode specifically blocks.
So, basically, what you want to do isn’t possible.
You’re either going to have to choose not to use use strict mode, or you’re going to have to work around the use of
eval
(I’d personally recommend never usingeval
…).Don’t use
eval
, create anew Function
instead. It won’t inherit lexical strict mode – and even better, it won’t inherit all your function-scoped and module-scoped variables:Also you don’t get the weird "(last) statement result" return value that
eval
uses, but can either confine thejs
code to be an expression or include areturn
statement in the code itself.