Rahul Iyer
Rahul Iyer

Reputation: 21005

How to pass multiple variables into an "eval" expression using "with"?

I am trying to accomplish something like in : eval() with variables from an object in the scope

The correct answers suggests using the "with" keyword, but I can't find any examples of someone actually using "with". Can someone explain how to pass multiple variables using "with" into an "eval" expression like in the link above ?

Upvotes: 0

Views: 816

Answers (1)

dandavis
dandavis

Reputation: 16726

i wouldn't recommend using with or eval except as a learning exercise because either one slows code down, and using them both at once is especially bad and frowned upon by the larger js community.

but it does work:

function evalWithVariables(code) {
  var scopes=[].slice.call(arguments,1), // an array of all object passed as variables
  A=[], // and array of formal parameter names for our temp function
  block=scopes.map(function(a,i){ // loop through the passed scope objects
        var k="_"+i;  // make a formal parameter name with the current position
        A[i]=k;  // add the formal parameter to the array of formal params
        return "with("+k+"){"   // return a string that call with on the new formal parameter
  }).join(""), // turn all the with statements into one block to sit in front of _code_
  bonus=/\breturn/.test(code) ? "": "return "; // if no return, prepend one in
   // make a new function with the formal parameter list, the bonus, the orig code, and some with closers
  // then apply the dynamic function to the passed data and return the result
  return Function(A, block+bonus+code+Array(scopes.length+1).join("}")).apply(this, scopes);  
}

evalWithVariables("a+b", {a:7}, {b:5}); // 12
evalWithVariables("(a+b*c) +' :: '+ title ", {a:7}, {b:5}, {c:10}, document);
// == "57 :: javascript - How to pass multiple variables into an "eval" expression using "with"? - Stack Overflow"

edited to use any number of scope sources, watch out for property name conflicts. again, i don't normally use with, but this was kinda fun...

Upvotes: 1

Related Questions