eval() è uno dei metodi "integrati" di JavaScript più potente. Ti permette di "valutare" un'espressione, anche molto complessa. Per "valutare" intendo che l'espressione all'interno delle parentesi di eval() (ovvero il suo argomento) viene prima eseguita fino al "risultato finale" e poi valutata. Ti faccio un es. pratico:
codice:
eval("document.Modulo.campo" + n);
Questo semplice codice, in cui n è una variabile numerica, ti permette di identificare e quindi di utilizzare un oggetto (di tipo Object) della pagina partendo dalla concatenazione di una stringa e di una variabile. Se nella pagina hai un form chiamato "Modulo" in cui hai per es. 2 campi di testo chiamati "campo1" e "campo2", eval() ti permette con quel codice di identificare uno di essi in base al valore di n.
Per prima cosa, viene eseguita l'espressione che eval() riceve come argomento. Questa espressione, nel caso di prima, è una semplice concatenazione. JavaScript esegue infatti la "somma" della stringa "document.Modulo.campo" con il valore di n (supponiamo sia 1). Dato che "document.Modulo.campo" è un oggetto di tipo String (stringa) JavaScript tenterà di convertirlo implicitamente in un numero per poterlo sommare al valore di n. Ovviamente non ci riuscirà, e quindi determinerà il "risultato" dell'espressione come una semplice concatenazione che origina la stringa "document.Modulo.campo1". A questo punto entra in gioco eval() che "valuta" questa stringa. eval() riconosce che si tratta del "percorso" che parte dall'oggetto document e che arriva all'oggetto campo1 (il primo dei tuoi campi di testo nel form). Per questo motivo, converte la semplice stringa in un "percorso" di oggetti (document, Modulo e campo1 sono tutti di tipo Object).
Grazie ad eval() quindi, non hai più una stringa, ma un riferimento ad un oggetto della pagina (campo1). Ora che hai determinato l'oggetto a cui ti riferisci con eval(), puoi chiaramente utilizzarlo per diverse cose, come leggerne o impostarne il valore (value), ecc.
Se tu, sempre nell'es. della pagina col form "Modulo" che contiene i campi "campo1" e "campo2", provavi a scrivere una cosa del genere:
codice:
n = 1;
var oggetto = "document.Modulo.campo" + n;
oggetto.value = "pippo";
ottenevi un errore come: "'oggetto' è nullo o non è un oggetto". Questo perché non hai usato eval() quando dichiari la variabile oggetto. Per JavaScript, in un caso come questo, la variabile oggetto è di tipo String e contiene il valore "document.Modulo.campo1", non un riferimento all'oggetto campo1 della tua pagina. Anche impostare il valore di oggetto con oggetto.value generava un errore, perché value è una proprietà di alcuni oggetti (di tipo Object) e non delle stringhe.
Nel tuo codice:
codice:
eval('/'+parola.substr(1,1)+'/gi')
eval() "valuta" la concatenazione delle stringhe "/", parola.substr(1,1) (che è una stringa) e "/gi". Quindi quello che ritorna non è un oggetto di tipo String ("/SOTTOSTRINGA/gi") ma una regular expression, ovvero un oggetto regExp.