关于动态执行代码(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 相关文章推荐
List the Stored Procedures in a SQL Server database
Jun 20 Javascript
javascript 清空form表单中某种元素的值
Dec 26 Javascript
javascript使用activex控件的代码
Jan 27 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
jquery Mobile入门—外部链接切换示例代码
Jan 08 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
Sep 26 Javascript
js实现页面导航层级指示效果
Aug 25 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php中变量及部分适用方法
2008/03/27 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php 代码优化之经典示例
2011/03/24 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
js变量提升深入理解
2016/09/16 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
token 机制和实现方式
2020/12/15 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
Python实现的HTTP并发测试完整示例
2020/04/23 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
python中wx模块的具体使用方法
2020/05/15 Python
QML用PathView实现轮播图
2020/06/03 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
Python截图并保存的具体实例
2021/01/14 Python
Foreo国际站:Foreo International
2018/10/29 全球购物
经贸日语专业自荐信
2014/09/02 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2014年党员整改措施
2014/10/24 职场文书
办公用品管理制度
2015/08/04 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL