2012-06-28 17 views
6

Ho un modulo che è fondamentalmente una calcolatrice. puoi digitare un'equazione e la valuterà. Ho anche 2 campi di memoria (caselle di testo denominate m1 e m2) in cui è possibile digitare qualcosa e che manterrà quel valore e quindi quando si digita un'espressione nella prima casella, è possibile fare riferimento a m1 o m2 nella propria equazione e valuterà usando i numeri che hai inserito nei campi di memoria.Come verificare se un nome di eval non è definito

Il problema è se si tenta di fare riferimento a m1 o m2 nella propria equazione e le caselle di testo sono vuote, si ottiene un errore non definito.

Ho girato le mie ruote per ore per provare a mettere una sorta di controllo che se l'equazione è valutata a indefinito, basta mostrare una finestra pop-up. Ho bisogno di questo in javascript javascript. ogni aiuto è apprezzato.

function displayResult(thisElement) 
{ 
    thisElement.value = eval(thisElement.value); <!-- this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc --> 
    if(!(thisElement.value>0)) 
    { 
     thisElement.value=0; 
    } 
} 

function mem(v) 
{ 
    v.value = eval(v.value); 
    eval(v.name+"="+v.value); 
} 

<input id="calcFormula" name="calculate" size="40" /> 
<input type="submit" value="Calculate" onclick="displayResult(this.form.calculate);" /> 

<input name="m1" id="m1" size="12" onchange="mem(this);" value="0" /> 
<input name="m2" id="m2" size="12" onchange="mem(this);" value="0" /> 
+0

Senza guardando troppo in profondità nella domanda, ci sarebbe un problema con il controllo per assicurarsi che m1.value e m2.value non siano indefiniti prima di provare a valutare? EDIT: Ok, posso vedere ora perché non avrebbe funzionato. Ammetto che è molto più complesso di quanto non sia apparso prima. –

+0

Ah !!! Troppo eval !! – Mageek

+0

Dovresti davvero usare una libreria come Knockout.js. Questo è troppo disordinato. –

risposta

7

mi viene in mente tre soluzioni:

  1. Si può fare ipotesi che m1 vuoto/m2 significa 0, quindi non ci sarà valore mai indefinito. Questo semplifica davvero le cose.
  2. È possibile utilizzare regexp per verificare innanzitutto l'eventuale presenza di m1 o m2 nell'equazione e, se esiste, verificare se non è definito.
  3. Ma il metodo migliore è utilizzare try...catch.

try/catch Esempio:

try { 
    eval('12+3+m1'); 
} catch (e) { 
    alert(e.message); 
} 
+0

Grazie per la modifica RobB :) –

+0

Non sapevo che js aveva una funzione try/catch. Ha funzionato come un fascino. – Catfish

1

le evalfails perché ha bisogno di caricare i dati dai campi del modulo, ma m1 è nessuna chiave di accesso per un campo di modulo, e m1 è variabile globale. , quindi fallisce. crea 2 variabili globali e lascia che le forme m1 e m2 memorizzino i loro valori lì sul cambiamento.

lo script originale non è riuscito perché la vostra funzione evals m1 e m2, ma vengono distrutti quando la funzione termina perché non sono portata globale

function displayResult(thisElement) { thisElement.value = eval(thisElement.value); <!-- this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc --> if(!(thisElement.value>0)) { thisElement.value=0; } } 
m1=0; 
m2=0; 

<input id="calcFormula" name="calculate" size="40" /> <input type="submit" value="Calculate" onclick="displayResult(this.form.calc ulate);" /> 

<input name="m1" id="m1" onchange="m1=this.value" size="12" value="0" /> <input name="m2" id="m2" size="12" onchange="m2=this.value;" value="0" /> 

Perché il vostro codice originale non è riuscita:

Step 1. M1 is stored in the form. 
step 2. Onchange event is fired 
step 3. Function mem(this) is called 
step 4. Entering scope of function mem 
step 5. Inserting this.name into string 
step 6. Inserting this.value into string 
Step 7. evalling string 
step 7.1 found code m1=1 
step 7.1.1 check window object for variable named m1 
step 7.1.1.1 failed. Create local variable for function mem called m1 
step 7.1.1.2 assign value 1 to scope variable m1 
step 7.1.1.3 exit eval 
step 7.1.1.4 exit function mem(this) 
step 7.1.1.5 check for scoped variables 
step 7.1.1.6 scoped variable found m1 
step 7.1.1.7 destroy scoped variable and free up memory 
step 7.1.2.2 passed. retrieve pointer to window object variable m1 
step 7.1.2.3 assign value 1 to window.m1 
step 7.1.2.4 exit eval 
step 7.1.2.5 exit function mem(this) 
step 7.1.2.6 check for scoped variables 
step 7.1.2.7 none found, resume other tasks. 
+0

Sbagliato. Non è affatto un problema di ambito. È un problema di eval() 'inserire un nome che non esiste. – Catfish

+0

è un problema di ambito. Quando si evapora con una funzione, senza globali, le variabili evallate vengono esaminate. Il suo codice valuta perfettamente i nomi var, ma solo nell'ambito della sua funzione – Tschallacka

+0

Allora perché funziona se ci sono valori in m1 e m2? Ho solo problemi quando non inserisci mai un valore in m1 e m2. È perché sono indefiniti. – Catfish

Problemi correlati