Riassunto
Il metodo eval()
esegue il codice JavaScript rappresentato come una stringa.
Sintassi
eval(stringa)
Parametri
string
- Una stringa che rappresenta un'espressione JavaScript, dichiarazione o sequenza di istruzioni. L'espressione può includere le variabili e le proprietà degli oggetti esistenti.
Descrizione
eval()
è una funzione dell'oggetto globale.
L'argomento della funzione eval()
è una stringa. Se la stringa rappresenta un'espressione, eval()
esegue l'espressione. Se l'argomento rappresenta una o più dichiarazioni Javascript, eval()
esegue le dichiarazioni. Non chiamare eval()
per eseguire un'operazione aritmetica, JavaScript la esegue automaticamente.
Se si costruisce un'espressione aritmetica come una stringa, è possibile usare eval()
per eseguirla in un secondo momento. Ad esempio, supponiamo di avere una variabile x
. E' possibile rinviare il valore di un'espressione che coinvolge x
assegnando il valore della stringa dell'espressione, tipo "3 * x + 2
", ad una variabile, e quindi chiamare eval()
in un punto successivo dello script.
Se l'argomento di eval()
non è una stringa, eval()
restituisce l'argomento immutato. Nell'esempio qui sotto, il costrutto String
viene specificato, e eval()
ritorna un oggetto String
piuttosto che il risultato della stringa.
eval(new String("2 + 2")); // returns a String object containing "2 + 2" eval("2 + 2"); // returns 4
E' possibile aggirare questa limitazione in modo generico utilizzando toString()
.
var expression = new String("2 + 2"); eval(expression.toString());
Non è possibile utilizzare la funzione eval
indirettamente, invocandola con un nome diverso da eval()
; se lo fai , potrebbe verificarsi un errore di sintassi. Per esempio, non si dovrebbe usare il seguente codice:
var x = 2; var y = 4; var myEval = eval; myEval("x + y");
Non usate eval inutilmente!
eval()
è una funzione pericolosa, che esegue il codice con i privilegi dell'amministratore della pagina. Se si esegue eval()
con una stringa che potrebbe essere interessata da un malintenzionato, si può interrompere l'esecuzione del codice dannoso sul computer dell'utente con il permesso della pagina Web. Ancora più importante, codici di terze parti possono vedere come eval()
è stata invocata, che può portare a possibili attacchi come Function
.
eval()
è generalmente più lenta rispetto alle alternative, dal momento che deve chiamare l'interprete di JS, mentre moltri altri costrutti sono ottimizzati da moderni "motori" JS.
Queste sono alternative più sicure (e veloci! ) ad eval()
per comuni impieghi.
Accesso alle proprietà utente
Si consiglia si non utilizzare eval()
per conventire i nomi di proprietà in proprietà. Consideriamo l'esempio qui sotto, dove le proprietà dell'oggetto acui accedere non è nota fino a quando viene eseguito il codice. Questo può essere fatto con eval:
var obj = { a: 20, b: 30 }; var propname = getPropName(); //returns "a" or "b" eval( "var result = obj." + propname );
Tuttavia, eval ()
non è necessario qui. In realtà, il suo uso è sconsigliato qui. Invece, utilizzare gli operatori membri, che sono molto più veloci e sicuri:
var obj = { a: 20, b: 30 }; var propname = getPropName(); //returns "a" or "b" var result = obj[ propname ]; // obj[ "a" ] is the same as obj.a
Utilizzare le funzioni invece di eseguire frammenti di codice
JavaScript ha funzioni di prima classe, il che significa che è possibile passare funzioni come argomenti ad altre API, memorizzarli in variabili e le proprietà degli oggetti, e così via. Molte API DOM sono progettate con questo in mente, in modo da poter (e devono) scrivere a:
// instead of setTimeout(" ... ", 1000) use: setTimeout(function() { ... }, 1000); // instead of elt.setAttribute("onclick", "...") use: elt.addEventListener("click", function() { ... } , false);
Le chiusure sono utili anche come un modo per creare funzioni parametrizzate senza concatenazioni di stringhe.
Analisi di JSON (conversione di stringhe in oggetti JavaScript)
Se la stringa che si sta chiamando eval()
contiene dati (per esempio un array: "[1, 2, 3]"
), al ontrario del codice, si dovrebbe considerareil passaggio a JSON, che permette la stringa di utilizzre un sottoinsieme della sintassi Javascript per rappresentare i dati. Vedi anche Downloading JSON and JavaScript in extensions.
Notare che, poichè la sintassi JSON è limitata rispetto alla sintassi di Javascript, molti letterali Javascript validi non analizzare come JSON. Ad esempio, le virgole finali non sono ammessi in JSON, e nomi di proprietà (chiavi) in letterali oggetto devono essere racchiusi tra virgolette. Assicurarsi di utilizzare un serializzatore JSON per generare le stringhe che vrranno successivamente analizzate come JSON.
Paasare i dati al posto di codici
Ad esempio, un'estensione progettata per raschiare contenuti delle pagine Web potrebbe avere le regole di raschiatura definite in XPath invece di codice Javascript.
Eseguire codice con privilegi limitati
Se devi eseguire il codice, considerare di eseguirlo con privilegi ridotti. Questo consilio vale soprattutto per le estensioni e le applicazioni XUL, che possono utilizzare Components.utils.evalInSandbox per questo.
Esempio
Il seguente esempio mostra output utilizzando document.write
. Nel server-side JavaScript, è possibile visualizzare la stessa uscita chiamando la funzione write()
invece di utilizzare il document.write()
.
Esempio: Usare eval
Nel codice seguente, entrambe le dichiarazioni contenenti eval()
restituiscono 42. La prima restituisce la stringa "x + y + 1
" ; la seconda esegue la stringa "42
".
var x = 2; var y = 39; var z = "42"; eval("x + y + 1"); // returns 42 eval(z); // returns 42
Esempio: Usare eval
Per eseguire una serie di istruzioni JavaScript.
Il seguente esempio utilizza eval()
per eseguire la stringa str
. Questa stringa consiste in una serie di istruzioni JavaScript che aprono una finestra di avviso e assegnano a z
un valore 42 se x
è di cinque, e assegna 0 a z
altrimenti. Quando viene eseguita la seconda istruzione, eval()
farà si che questa dichiarazioni da effettuare, e sarà anche eseguire l'insieme di istruzioni e restituire il valore che viene assegnato a z
.
var x = 5; var str = "if (x == 5) {alert('z is 42'); z = 42;} else z = 0; "; document.write("<P>z is ", eval(str));
Esempio: L'ultima espressione viene eseguita
eval()
restituisce il valore dell'ultima espressione valutata.
var str = "if ( a ) { 1+1; } else { 1+2; }"; var a = true; var b = eval(str); // returns 2 alert("b is : " + b); a = false; b = eval(str); // returns 3 alert("b is : " + b);
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition. | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) The definition of 'eval' in that specification. |
Standard | |
ECMAScript 6 (ECMA-262) The definition of 'eval' in that specification. |
Release Candidate |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome per Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Gecko-specific notes
- Storicamente
eval()
ha avuto un secondo argomento opzionale, specificando un oggetto nel cui contesto la valutazione doveva essere eseguita. Questo argomento è stato non-standard, ed è stato rimosso dal SpiderMonkey in Gecko 1.9.1 (Firefox 3.5). Vedere bug 442333.