MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

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.

Vedi anche

Tag del documento e collaboratori

 Hanno collaborato alla realizzazione di questa pagina: teoli, SphinxKnight, Ruggi
 Ultima modifica di: teoli,