eval5: TypeScript编写的JavaScript解释器

eval5是基于TypeScript编写的JavaScript解释器,100%支持ES5语法。

项目地址:https://github.com/bplok20010/eval5

使用场景

  • 浏览器环境中需要使用沙盒环境执行JavaScript脚本
  • 控制代码执行时长
  • 不支持eval Function的JavaScript运行环境:如 微信小程序
  • 研究/学习用

安装

npm install --save eval5

使用

import { Interpreter } from ‘eval5‘;

const ctx = {
    console,
    hello(){
        console.log(‘hello eval5‘)
    }
}
var interpreter = new  Interpreter(ctx, {
    timeout: 1000
});

var result = interpreter.evaluate(`
    hello();
    function sum(a, b) {
        return a + b;
    }
    sum(100,2 00);
`)

console.log(result); // 300

eval5不支持es6语法,可以先将es6或typescript转成es5

原理

  1. eval5先将源码编译得到树状结构的抽象语法树(AST)。
    抽象语法树由不同的节点组成,每个节点的type标识着不同的语句或表达式,例如: 1+1的抽象语法树

    {
    "type": "Program",
    "body": [
        {
            "type": "ExpressionStatement",
            "expression": {
                "type": "BinaryExpression",
                "operator": "+",
                "left": {
                    "type": "Literal",
                    "value": 1,
                    "raw": "1"
                },
                "right": {
                    "type": "Literal",
                    "value": 1,
                    "raw": "1"
                }
            }
        }
    ],
    "sourceType": "script"
    }
  2. 根据节点type编写不同的处理模块并得到最终结果。例如:根据1+1的语法树我们可以写出一下解释器代码:
    function handleBinaryExpression(node) {
    switch( node.operator ) {
        case ‘+‘:
            return node.left.value + node.right.value;
        case ‘-‘:
            return node.left.value - node.right.value;
    }
    }

示例

在线体验

更多示例

以下是解析echarts4效果示例:

原文地址:https://blog.51cto.com/7453775/2484869

时间: 2024-10-10 03:03:29

eval5: TypeScript编写的JavaScript解释器的相关文章

分享:使用 TypeScript 编写的 JavaScript 游戏代码

<上篇博客>我写出了我一直期望的 JavaScript 大型程序的开发模式,以及 TS(TypeScript) 的一些优势.博客完成之后,我又花了一天时间试用 TS,用它来重构之前编写的一个 JS 游戏:<Javascript 坦克游戏>.   源码下载 源码我已经上传到 CSDN 了,无需资源分,下载地址:http://download.csdn.net/detail/zgynhqf/8565873. 源码使用 VS 2013 +TypeScript 1.4 进行开发.打开后,显

在 Mac OS 上使用 TypeScript 编写 ASP.NET 5 应用

在 Mac OS 上使用 TypeScript 编写 ASP.NET 5 应用? 提示 本文更新时间:2015年12月24日. 在 Mac OS 上,并没有时候编辑 ASP.NET 5 的 IDE,只有一个 Visual Studio Code 可用, 这种情况下,编写后端代码是比较费劲的(对于习惯使用IDE的人来说),所以本文从前端的角度来介绍下. 本文将引导你创建一个 d3 数据变化曲线的展现过程. 什么是 TypeScript? 写过 JavaScript 的人都知道, JavaScrip

使用TypeScript如何提升JavaScript编程效果?

TypeScript是个什么鬼?和JavaScript有什么关系? TypeScript是由微软开发的一种可快速入门的开源的编程语言,是JavaScript的一个超集,且向这个语言添加了可选的静态类型和基于类的面向对象编程.能够帮助web前端开发人员编出更出色的JavaScript代码.搞定规模可观的JavaScript项目并为ECMAScript 6的来临做好准备. JavaScript是一款通用脚本语言,植根于开发工具的核心深处,同时在Node.js等服务器端实现方案中也有所体现.除此之外,

CoffeeScript?TypeScript?还是JavaScript

请注意本文只是我的偏见,我努力地理解借助CoffeeScript或TypeScript之类的编译器写JavaScript代码的理由.静态编译.强类型语言和框架,我有着这些流行的.丰富的背景.我的上一份工作就是使用TypeScript,因为我不得不使用.那是一段不快乐的时光,我将因此而离开. 我很幸运地把自己从这种困境和负担中释放出来,正在完全地使用JavaScript编写代码,我对此感到格外高兴!如果我对于这种变化的热情还不够明显,请让我向你保证,我现在更开心了.有一点很重要,我不是在暗示静态编

【JavaScript】【译】编写高性能JavaScript

英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执行的大型JavaScript应用所设计的.如果你是一个开发者,并且关心内存使用情况与页面性能,你应该了解用户浏览器中的JavaScript引擎是如何运作的.无论是V8,SpiderMonkey的(Firefox)的Carakan(Opera),Chakra(IE)或其他引擎,这样做可以帮助你更好地优

编写高性能Javascript

编写高性能Javascript 多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执行效率影响不明显.但在某些情况下,不优化的Javascript代码必然会影响用户的体验.因此,即使在当前硬件性能已经大大提升的时代,在编写Javascript代码时,若能遵循Javascript规范和注意一些性能方面的知识,对于提升代码的可维护性和优化性能将大有好处.

使用Typescript来写javascript

使用Typescript来写javascript 前几天尝试使用haxejs来写javascript,以获得静态类型带来的益处.虽然成功了,但很快发现将它与angularjs一起使用,有一些不太顺畅的地方,导致开发效率没有提升,反而下降了.虽然我认为使用haxejs来写普通的js(或者与jquery相关的js)没有问题,但不适合与angularjs这样与HTML侵入较大的js框架配合. 昨天偶然发现idea居然支持typescript了,于是打算尝试一下typescript,目前的感觉还不错,相

在TypeScript中扩展JavaScript基础对象的功能

最近工作中用到,记录一下:假设我们需要一个功能,把一个数字比如10000输出为下面的字符串格式“10,000”,一般是写一个方法,那么我希望更方便一点,直接向Number类型添加一个格式化方法,比如叫toFormat的方法来实现得到格式化后的字符串. 添加.d.ts定义 要在TypeScript中扩展一个基础对象的方法需要预先告知编译器有该方法才行: 1 interface Number { 2 toFormat(): string; 3 } 添加实现 具体实现根据需要编写即可,需要注意的是要添

[TypeScript] Type check JavaScript files using JSDoc and Typescript 2.5

Typescript 2.5 adds JSDoc type assertion support for javascript file via ts-check service. First of all, you should make sure you have [email protected] install: sudo npm i -g [email protected] Then add @ts-check to the top of js file: // @ts-check T