2012-06-28 15 views
6

Tengo un formulario que es básicamente una calculadora. puedes escribir una ecuación y la evaluará. También tengo 2 campos de memoria (cuadros de texto llamados m1 y m2) donde puede escribir algo y tendrá ese valor y luego cuando escriba una expresión en el primer cuadro, puede hacer referencia a m1 o m2 en su ecuación y evaluará usando los números que ingresó en los campos de memoria.Cómo verificar si un nombre eval no está definido

El problema es que si intentas hacer referencia a m1 o m2 en tu ecuación y los cuadros de texto están en blanco, obtienes un error indefinido.

He estado girando las ruedas durante horas para tratar de verificar que si la ecuación se evalúa como indefinida, solo muestre un cuadro emergente. Necesito esto en raw javascript. cualquier ayuda es apreciada

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

Sin Al analizar la cuestión con demasiada profundidad, ¿habrá algún problema al verificar que m1.value y m2.value no estén indefinidos antes de intentar evaluar? EDITAR: Bien, ahora puedo ver por qué eso no funcionaría. Admito que esto es mucho más complejo de lo que parecía. –

+0

¡¡¡Ah !!! Demasiado eval !! – Mageek

+0

Realmente debería usar una biblioteca como Knockout.js. Esto es demasiado complicado. –

Respuesta

7

me ocurren tres soluciones:

  1. Usted puede hacer supuesto de que m1 vacío/m2 significa 0, por lo que habrá valor nunca indefinido. Esto realmente simplifica las cosas.
  2. Puede usar regexp para verificar primero cualquier aparición de m1 o m2 en la ecuación y si existe, verifique si no está definida.
  3. Pero el mejor método es usar try...catch.

Try/Catch Ejemplo:

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

Gracias por editar RobB :) –

+0

No sabía que js tenía una función de prueba/captura. Trabajado como un encanto. – Catfish

1

los evalfails porque tiene que cargar los datos de los campos del formulario, pero m1 hay ninguna clave de acceso para un campo de formulario, y m1 es ninguna variable global. , entonces falla crea 2 variables globales y deja que los formularios m1 y m2 almacenen sus valores allí en el cambio.

su guión original falla porque su función evals M1 y M2, sino que se destruyen cuando la función termina porque no son de alcance global

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" /> 

Por qué su código original no:

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

Incorrecto. No es un problema de alcance en absoluto. Es un problema de evaluar() un nombre que no existe. – Catfish

+0

es un problema de alcance. Al evadir con una función, sin globales, las variables evaluadas tienen un alcance. Su código evalúa perfectamente los nombres de var, pero solo en el alcance de su función – Tschallacka

+0

Entonces, ¿por qué funciona si hay valores en m1 y m2? Solo tengo problemas cuando nunca ingresas un valor en m1 y m2. Es porque no están definidos. – Catfish