• eval的妙用:条件判断的解析


    在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返回复杂信息。
    自认为算一个“妙用”吧:)

  • 相关阅读:
    重写/覆盖基类的事件
    关于“日志”的输出控制
    WPF中DataGrid垂直滚动条滚动后导致每行CheckBox选择错乱
    WPF窗体应用程序开发
    C# 操作自定义config文件
    WPF绑定数据源之RelativeSource
    C# http请求 设置代理(标题可以作为搜索关键字)
    前端加载特效
    实现不同的项目,用不同的git 账号提交
    Casbin 使用记录
  • 原文地址:https://www.cnblogs.com/zhukezhuke/p/1546829.html
Copyright © 2020-2023  润新知