Reputation: 28414
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 ?
Upvotes: 52
Views: 51174
Reputation: 191
use anonymous function
let str = 'return 2+2+2'
let res = new Function(str)()
console.log(res) // 6
let fn = new Function('e','return e+e+e')
res = fn(3)
console.log(res) // 9
Upvotes: 0
Reputation: 233
In 2019 using Template Literals:
var customJSfromServer = "2+2+2;"
var evalValue = eval(`${customJSfromServer}`);
alert(evalValue) ;// should be "6";
Upvotes: -2
Reputation: 5588
Modify server response to get "2+2+2" (remove "return") and try this:
var myvar = eval(response);
alert(myvar);
Upvotes: 1
Reputation: 12395
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);
Upvotes: 101
Reputation: 75317
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";
Upvotes: 10
Reputation: 11508
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.
Upvotes: 2
Reputation: 8573
var customJSfromServer = "2+2+2;"
var evalValue = eval(customJSfromServer);
alert(evalValue) ;// should be "6";
Upvotes: 3
Reputation: 11779
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
Upvotes: 2