如何检查评估名称是否未定义
How to check if an eval name is undefined
我有一个基本上是计算器的表格。 你可以输入一个方程,它会评估它。我还有 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" />
我可以想到三种解决方案:
- 您可以假设空的 m1/m2 表示 0,因此永远不会有未定义的值。这确实简化了事情。
- 您可以使用正则表达式首先检查方程中是否出现任何 m1 或 m2,如果存在,则检查是否未定义。
- 但最好的方法是使用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.
相关文章:
- 检查对象的所有属性是否未定义
- AngularJs 检查是否未定义和空的最佳实践
- 离子警报 - 检查结果是否未定义
- 什么更快?运行空函数或检查函数是否未定义
- Jquery Ajax 和 Json:如何检查是否未定义
- 函数返回undefine,即使我在返回之前检查了变量是否未定义
- 在执行脚本之前,请查看对象是否未定义
- 如何进行单元测试以查看角度是否未定义
- 为什么我无法检查对象节点是否未定义
- 检查变量是否未定义不起作用
- 如何检查评估名称是否未定义
- 使用挖空检查是否未定义
- 时间微调器检查是否未定义不起作用
- 检查在.ech()内部使用jQuery.find()时是否未定义
- 检查两个变量是否未定义
- ReferenceError: Can't find variable: google"检查是否未定义
- 检查对象参数是否未定义
- 为什么这个检查抛出错误,即使我事先检查了它是否未定义
- 如何检查文字中的属性是否未定义
- 如何检查元素是否未定义