关于动态执行代码(js的Eval)实例详解


Posted in Javascript onAugust 15, 2016

熟悉javascript的朋友对Eval()函数可能都不会陌生,我们可以用它来实现动态代码的执行,我自己甚至写过一个网页专门用来计算算术表达式的,计算能力上比google、baidu的计算器还要好一些,至少精度要高,但是如果超出了四则运算的话,表达式的形式会复杂很,比如以百度给出的例子:

log((5+5)^2)-3+pi需要写成Math.log(Math.pow(5+5,2))*Math.LOG10E-3+Math.PI才能用Eval进行计算,对于这一点我还没有想到理想的解决方案。好了,这不是本文正题,我们姑且放过。

博客园里曾经见人用过下面的代码,至少从代码形式上挺简单的:

// csc.exe noname1.cs /r:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Microsoft.JScript.dll 
//注:需加入Microsoft.JScript与Microsoft.Vsa两个命名空间。
public class Class1
{
  static void Main(string[] args)
  {
    System.Console.WriteLine("Hello World");
    string Expression = "var result:int =0;result==1?\"成功\":\"失败\"";
    Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
    Console.WriteLine(Microsoft.JScript.Eval.JScriptEvaluate(Expression, ve));
  }
}

不过,令人不爽的是,编译环境现在给出如下警告:'Microsoft.JScript.Vsa.VsaEngine' is obsolete: 'Use of this type is not recommended because it is being deprecated in Visual Studio 2005; there will be no replacement for this feature. Please see the ICodeCompiler documentation for additional help.'当然,代码可以编译通过,且执行是正常的。

下面我给出另外一种直接使用javascript的Eval函数的方法,借助于com组件,引用路径是 %SystemRoot%\system32\msscript.ocx ,我将完整的代码直接贴出来。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ScriptProgramming
{
  class Program
  {
    static void Main(string[] args)
    {
      string strExpression = "1+2*3";
      string strResult = Eval(strExpression);
      Console.WriteLine(strExpression + "=" + strResult);
 
      Console.WriteLine("Press any key to continue.");
      Console.ReadKey();
    }
    /// <summary>
    /// 引用com组件Microsoft Script Control
    /// %SystemRoot%\system32\msscript.ocx
    /// 该函数用来动态执行代码
    /// </summary>
    /// <param name="Expression"></param>
    /// <returns></returns>
    public static string Eval(string Expression)
    {
      string strResult = null;
      try
      {
        MSScriptControl.ScriptControlClass jscript = new MSScriptControl.ScriptControlClass();
        jscript.Language = "JScript";        
        strResult = jscript.Eval(Expression).ToString();
      }
      catch (Exception ex)
      {
        Debug.Fail(ex.Message);        
      }
      return strResult;
    }
  }
}

以上这篇关于动态执行代码(js的Eval)实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript同步Import,同步调用外部js的方法
Jul 08 Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
简介JavaScript中substring()方法的使用
Jun 06 Javascript
js+html5操作sqlite数据库的方法
Feb 02 Javascript
浅析JS异步加载进度条
May 05 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
js实现百度登录框鼠标拖拽效果
Mar 07 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 Javascript
vue实现放大镜效果
Sep 17 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 #Javascript
对js eval()函数的一些见解
Aug 15 #Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
Aug 15 #Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 #Javascript
jQuery学习笔记之回调函数
Aug 15 #Javascript
纯css下拉菜单 无需js
Aug 15 #Javascript
浅谈JavaScript 中有关时间对象的方法
Aug 15 #Javascript
You might like
在PHP中执行系统外部命令
2006/10/09 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP常用处理静态操作类
2015/04/03 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
javaScript如何生成xmlhttp
2013/12/16 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
node跨域请求方法小结
2017/08/25 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 切片和range()用法说明
2013/03/24 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python中字符串的修改及传参详解
2016/11/30 Python
python 系统调用的实例详解
2017/07/11 Python
儿童python练习实例
2018/05/27 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
python软件都是免费的吗
2020/06/18 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
总经理助理的八要求
2013/11/12 职场文书
大专生简历的自我评价
2013/11/26 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
英文感谢信格式
2015/01/21 职场文书
追悼会家属答谢词
2015/09/29 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js