2011-09-13 12 views
26

Ho bisogno di valutare una funzione personalizzata passata dal server come una stringa. Fa tutto parte di un JSON complicato ricevo, ma in ogni caso, mi sembra di essere bisogno di qualcosa sulla falsariga:Come posso utilizzare js eval per restituire un valore?

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

Ovviamente questo non funziona come mi aspettavo. In qualsiasi modo posso raggiungere questo?

risposta

55

Il primo metodo è quello di elimina restituisce parole chiave e il punto e virgola:

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

note il '(' e ')' è un must.

o si può fare una funzione:

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

ancora più semplice, non usare eval:

var expression = 'return 2+2+2;'; 
var result = new Function(expression)(); 
alert(result); 
+0

Grazie per questo. Nel tuo secondo esempio, 'eval ('(function() {' + expression + '}())');' fallisce nel caso in cui ci sia un commento sull'ultima riga dell'espressione, con un errore tipo ** inaspettato fine dell'input **. Per risolvere il problema, aggiungi una nuova riga alla fine: ''\ n}())''. – gregn3

+0

Grazie per la soluzione, ho usato il secondo esempio, con una nuova riga '\ n}())' alla fine e ha funzionato bene. –

2

Non ci dovrebbero essere dichiarazioni di reso, poiché eval leggerà questo come statment e non restituirà valore.

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

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

+0

Questo probabilmente funziona anche se dichiari" evalValue "al di fuori della stringa. – Thilo

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

Questo funziona:

function answer() { 
    return 42; 
} 

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

È necessario avvolgere il ritorno all'interno di una funzione e dovrebbe passare il valore sul dalla eval.

6

Se si riesce a garantire l'istruzione return esisterà sempre, si potrebbe trovare il seguente più appropriato:

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

Naturalmente, si potrebbe anche fare:

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

risposta del server Modifica per ottenere "2 + 2 + 2" (rimuovi ritorno" ") e prova questo:

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