46

I need to evaluate a custom function passed from the server as a string. It's all part of a complicated json I get, but anyway, I seem to be needing something along the lines:

var customJSfromServer = "return 2+2+2;"
var evalValue = eval(customJSfromServer);
alert(evalValue) ;// should be "6";

Obviously this is not working as I expected. Any way I can achieve this ?

Radu094
  • 27,418
  • 16
  • 57
  • 78

7 Answers7

91

The first method is to delete return keywords and the semicolon:

var expression = '2+2+2';
var result = eval('(' + expression + ')')
alert(result);

note the '(' and ')' is a must.

or you can make it a function:

var expression = 'return 2+2+2;'
var result = eval('(function() {' + expression + '}())');
alert(result);

even simpler, do not use eval:

var expression = 'return 2+2+2;';
var result = new Function(expression)();
alert(result);
otakustay
  • 10,669
  • 3
  • 36
  • 42
  • 2
    Thanks for this. In your second example, the `eval('(function() {' + expression + '}())');` fails in case there is a comment on the last line of the expression, with an error like **unexpected end of input**. To fix it, add a newline to the end: `'\n}())'`. – gregn3 Dec 13 '16 at 19:05
  • Thanks for the solution ,i used second example ,with a new line '\n}())' at the end and it worked fine. – Muhammad Mufeez Ahmed Jan 02 '18 at 16:09
10

If you can guarantee the return statement will always exist, you might find the following more appropriate:

var customJSfromServer = "return 2+2+2;"
var asFunc = new Function(customJSfromServer);
alert(asFunc()) ;// should be "6";

Of course, you could also do:

var customJSfromServer = "return 2+2+2;"
var evalValue = (new Function(customJSfromServer)());
alert(evalValue) ;// should be "6";
Matt
  • 72,564
  • 26
  • 147
  • 178
3
var customJSfromServer = "2+2+2;"
var evalValue = eval(customJSfromServer);
alert(evalValue) ;// should be "6";
chim
  • 8,095
  • 3
  • 49
  • 59
2

There should not be return statement , as eval will read this as statment and will not return value.

var customJSfromServer = "2+2+2;"
var evalValue = eval( customJSfromServer );
alert(evalValue) ;// should be "6";

see http://www.w3schools.com/jsref/jsref_eval.asp

SergeS
  • 10,948
  • 2
  • 28
  • 35
2

This works:

function answer() {
    return 42;
}

var a = eval('answer()');
console.log(a);

You need to wrap the return inside a function and it should pass the value on from the eval.

Alex Ciminian
  • 11,087
  • 15
  • 59
  • 93
1

Modify server response to get "2+2+2" (remove "return") and try this:

var myvar = eval(response);
alert(myvar);
genesis
  • 49,367
  • 20
  • 94
  • 122
Matjaz Muhic
  • 4,810
  • 2
  • 15
  • 32
-1

In 2019 using Template Literals:

var customJSfromServer = "2+2+2;"
var evalValue = eval(`${customJSfromServer}`);
alert(evalValue) ;// should be "6";
leoncc
  • 227
  • 3
  • 6