关于动态执行代码(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编写技巧整理
Aug 23 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
Jun 03 Javascript
获取中文字符串的实际长度代码
Jun 05 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
jQuery中andSelf()方法用法实例
Jan 08 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
Jun 30 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
Jul 10 jQuery
React冒泡和阻止冒泡的应用详解
Aug 18 Javascript
如何利用js在两个html窗口间通信
Apr 27 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
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
python使用7z解压apk包的方法
2015/04/18 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
采购部部门职责
2013/12/15 职场文书
寒假安全保证书
2015/02/28 职场文书
毕业生个人自荐书
2015/03/05 职场文书
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
Redis读写分离搭建的完整步骤
2021/09/14 Redis
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS