关于动态执行代码(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 相关文章推荐
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
js点击出现悬浮窗效果不使用JQuery插件
Jan 20 Javascript
node.js中的fs.readFileSync方法使用说明
Dec 15 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
Javascript进制转换实例分析
May 14 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 Javascript
jquery表单验证插件validation使用方法详解
Jan 20 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
js实现旋转木马轮播图效果
Jan 10 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在Web开发领域的优势
2006/10/09 PHP
用PHP函数解决SQL injection
2006/12/09 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
Laravel 队列使用的实现
2019/01/08 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python如何利用Mitmproxy抓包
2020/10/10 Python
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
几道数据库的概念性面试题
2014/05/30 面试题
广告学专业毕业生自荐信
2013/09/24 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
手机银行营销方案
2014/03/14 职场文书
承诺书样本
2014/08/30 职场文书
项目投资意向书范本
2015/05/09 职场文书
优质护理心得体会
2016/01/22 职场文书
2016春季运动会开幕词
2016/03/04 职场文书