Radu094
Radu094

Reputation: 28414

How can I use js eval to return a value?

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

Answers (8)

perona chan
perona chan

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

leoncc
leoncc

Reputation: 233

In 2019 using Template Literals:

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

Upvotes: -2

Matjaz Muhic
Matjaz Muhic

Reputation: 5588

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

var myvar = eval(response);
alert(myvar);

Upvotes: 1

otakustay
otakustay

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

Matt
Matt

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

Alex Ciminian
Alex Ciminian

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

chim
chim

Reputation: 8573

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

Upvotes: 3

SergeS
SergeS

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

Related Questions