在javascript中eval()函数功能就是执行一段javascript代码字符串,相当于SQL里的execute(执行一条动态拼接出的SQL,经常用到)。w3school中介绍eval时说,它的功能强大,但使用到的情况却不多。先附上两个简单例子:
1.eval("1+2") 很简单,返回1+2的结果3,很多文章首先就以它为例,实际上似乎很少用到
2.动态获取表单元素:
1 function SetInputValue(inputName){
2 var input = eval("document.form1." + inputName);
3 input.value = "test";
4 }
初学javascript时经常这样写,只需用getElementById等方法代替即可,用jQuery的选择器就更简单了。
另外,据网友测试的结果,eval的效率会低一些。
步入正题,在写webform时会碰到根据form中栏位的值来判断,例如根据金额栏位来决定表单流程的签核权限,或N次and、or逻辑组合起来的判断条件。这些“无价值”的判断是易变的,user就是上帝,说改就得改,这种hardcode越来越多,后续变得不易维护,此时便有必要将“条件判断”提取出来。将这个条件判断表达式用以字符串的方式存储起来,调用时用eval执行即可。
改版前:
1if(Money >= 1000)
2{
3 //需要部级主管签核
4}
5if(Money >= 10000)
6{
7 //需要总经理签核
8}
9
用eval后:
1function GetAdmin()
2{
3 通过XHR将表单数据提交给后台处理程序,返回相应结果
4}
签核权限在Table中维护好:
栏位:条件表单式 结果
数据:if(${Money} >=1000){"true"} 部级主管
if(${Money} >=10000){"true"} 总经理
后台处理程序将Money的实际值去替换${""},即变成可执行的js代码,eval后得到true即表示满足此条件,程式即返回相应的“结果”。例如可以写更复杂的条件表达式:
1 if(${Money} >= 1000 && (${栏位A} == "on" || ${栏位B} != "on")){
2 if(${栏位C}){
3 return "true";
4 }
5 if(${栏位D}){
6 return "true";
7 }
8 }
这个条件表达式在用其他界面去维护,或使用xml去配置。若碰到条件判断比较多、简单(例如只是根据某个栏位值来判断)、易变,这样的方式比较有成效。
既然if条件可以这样,那return的结果同样也可以是动态的,例如:
1if ("${TelNumber}" == "on") {
2 eval('if("${NewAdd}"=="ON"){"申請新分機號碼"}else if("${NewAdd}"=="ON2"){"使用部門已存在的分機號碼:${T22}"}else{"使用部門已存在的分機號碼:${T33}"}') + ",所在線號:${Location}"
3}
嵌套使用eval返回复杂信息。
自认为算一个“妙用”吧:)