如何检查eval名称是否未定义

时间:2012-06-28 21:25:47

标签: javascript html

我有一个基本上是计算器的表格。你可以输入一个等式,它会评估它。我还有2个内存字段(文本框名为m1和m2),您可以在其中键入内容并保存该值,然后在第一个框中键入表达式时,可以在等式中引用m1或m2将使用您在内存字段中输入的数字进行评估。

问题是,如果您尝试在等式中引用m1或m2并且文本框为空,则会出现未定义的错误。

我一直在旋转我的车轮几个小时尝试进行某种检查,如果方程式被评估为未定义,只需显示一个弹出框。我需要原始javascript 。任何帮助表示赞赏。

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

2 个答案:

答案 0 :(得分:7)

我可以想到三个解决方案:

  1. 你可以假设空m1 / m2表示0,所以会有 永远不定义的价值。这真的简化了事情。
  2. 您可以使用正则表达式首先检查等式中是否出现m1或m2,如果存在,则检查是否未定义。
  3. 但最好的方法是使用try...catch
  4. 尝试/捕获示例:

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

答案 1 :(得分:1)

evalfails因为它需要从表单字段加载数据,但是m1不是表单字段的访问键,而m1不是全局变量,所以它失败了。 创建2个全局变量,让m1和m2表单在变化时存储它们的值。

您的原始脚本失败,因为您的函数会破坏m1和m2,但是当函数结束时它们会被破坏,因为它们不是全局范围

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

为什么您的原始代码失败了:

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.