如何检查评估名称是否未定义

How to check if an eval name is undefined

本文关键字:是否 未定义 评估 何检查 检查      更新时间:2023-09-26

我有一个基本上是计算器的表格。 你可以输入一个方程,它会评估它。我还有 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" />

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

  1. 您可以假设空的 m1/m2 表示 0,因此永远不会有未定义的值。这确实简化了事情。
  2. 您可以使用正则表达式首先检查方程中是否出现任何 m1 或 m2,如果存在,则检查是否未定义。
  3. 但最好的方法是使用try...抓住。

尝试/捕获示例:

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

失败,因为它需要从表单域加载数据,但 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.