skip to Main Content

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


  1. 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 using eval…).

    Login or Signup to reply.
  2. Don’t use eval, create a new Function instead. It won’t inherit lexical strict mode – and even better, it won’t inherit all your function-scoped and module-scoped variables:

    "use strict";
    
    function evalInScope(js, contextAsScope) {
      return new Function(`with (this) { return (${js}); }`).call(contextAsScope);
    }
    
    console.log(evalInScope("a + b", { a: 1, b: 2 })); // 3

    Also you don’t get the weird "(last) statement result" return value that eval uses, but can either confine the js code to be an expression or include a return statement in the code itself.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search