eval5

JavaScript 解释器
授权协议 MIT
开发语言 JavaScript TypeScript
所属分类 Web应用开发、 浏览器/JS引擎
软件类型 开源软件
地区 国产
投 递 者 姜景辉
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

eval5

基于 TypeScript 编写的 JavaScript 解释器

支持浏览器、node.js、小程序等 JavaScript 运行环境

在线体验

更多示例

使用场景

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

支持 ECMAScript 版本

ES5

安装

npm install --save eval5

使用

import { Interpreter } from "eval5";

const interpreter = new Interpreter(window, {
	timeout: 1000,
});

let result;

try {
	result = interpreter.evaluate("1+1");
	console.log(result);

	interpreter.evaluate("var a=100");
	interpreter.evaluate("var b=200");
	result = interpreter.evaluate("a+b");

	console.log(result);
} catch (e) {
	console.log(e);
}

参数

interface Options {
	// 默认为:0,不限制
	timeout?: number;
	// 根作用域,只读
	rootContext?: {} | null;
	globalContextInFunction?: any;
}

Example

import { Interpreter } from "eval5";

const ctx = {};
const interpreter = new Interpreter(ctx, {
    rootContext: window,
	timeout: 1000,
});

interpreter.evaluate(`
    a = 100;
    console.log(a); // 100
`);

window.a;//undefined

Interpreter

version

当前版本

global

默认值: {}

设置默认的全局作用域

Interpreter.global = window;
const interpreter = new Interpreter();
interpreter.evaluate('alert("hello eval5")');

globalContextInFunction

默认值: undefined

eval5 不支持 use strict 严格模式, 在非严格下的函数中this默认指向的是全局作用域,但在eval5中是undefined, 你可以通过globalContextInFunction来设置默认指向。

import { Interpreter } from "Interpreter";

const ctx = {};
const interpreter = new Interpreter(ctx);
interpreter.evaluate(`
this; // ctx
function func(){
    return this; // undefined
}
func();
`);
import { Interpreter } from "Interpreter";

Interpreter.globalContextInFunction = window;
const ctx = {};
const interpreter = new Interpreter({});
interpreter.evaluate(`
this; // ctx
function func(){
    return this; // window
}
func();
`);

再看以下代码:

注意: Illegal invocation 错误

这就是globalContextInFunction默认设为undefined的原因

import { Interpreter } from "Interpreter";

Interpreter.globalContextInFunction = {};

const ctx = {alert: alert};

const interpreter = new Interpreter(ctx);

interpreter.evaluate(`
// alert.call({}, 'Hello eval5')
// Illegal invocation
alert('Hello eval5');
`);

constructor(context?: {}: options: Options = Interpreter.global)

构造函数

Interpreter 的实例方法

evaluate(code: string): any

执行给定的字符串代码,并返回最后一个表达式的值

import { Interpreter } from "Interpreter";

const interpreter = new Interpreter(window);

const result = interpreter.evaluate(`
var a = 100;
var b = 200;

a+b;

`);

console.log(result); // 300

appendCode(code: string): any

evaluate的别名

getExecutionTime(): number

获取上一次调用evaluate的执行时长

setExecTimeout(timeout: number = 0): void

设置执行时长

getOptions(): Readonly<Options>

获取解释器参数


evaluate(code: string, ctx?: {}, options?: Options)

执行给定的字符串代码,并返回最后一个表达式的值

注: 该函数每次执行都会创建一个新的解释器

import { evaluate } from "eval5";

evaluate(
	`
var a = 100;
var b = 100;
console.log(a+b);
`,
	{ console: console }
); // 200

evaluate(`
    a;
`); // a is not defined

Function

该函数会将Interpreter.global Interpreter.globalContextInFunction当作默认值并创建新的解释器

import { Function } from "eval5";

const func = new Function("a", "b", "return a+b;");
console.log(func(100, 200)); // 300

vm

查看 vm

  • vm.createContext
  • vm.compileFunction
  • vm.runInContext
  • vm.runInNewContext
  • vm.Script

License

MIT

  • 引言 JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性,因此它也遭到了微信官方的封禁。记得以前有些人想用eval实现热更新代码,而不用经过审核,封掉这类型的代码是正常的。但是,eval函数的优点也是很明显的。例如,使用JS编写一个计算器程序,在遇到"2+1-3*5"这样的字符串时,使用eval就可以很容易地计算出,类似如: var result="2

  • 解释 eval全称evaluate([ɪˈvæljueɪt]),英语单词,主要用作及物动词、不及物动词,作及物动词时意为“评价;估价;求…的值”,作不及物动词时意为“评价;估价”。 js中的eval eval是什么?(解析器) eval是一个函数,看本质function  eval() { [native code] } 怎样使用eval? 语法:string 必需。要计算的字符串,其中含有要计算

  • 一、eval()的作用 把字符串参数解析成JS代码并运行,并返回执行的结果; 例如:   1、eval("2+3");//执行加运算,并返回运算值。   2、eval("varage=10");//声明一个age变量 二、eval的作用域在它所有的范围内容有效 例如1: functiona(){      eval("var x=1"); //等效于 var x=1;       console.

  • 学校老师让我们用小程序写计算器,运行的时候发现eval函数用不了,找了很久,也试过装npm,搞了很久,但是一直报错,然后找到了这个。 说明一下——eval函数要少用,不安全,不推荐 复制下面的代码就能直接用了 //测试 console.log(expressionCalc('5+4-2+7*3/2')); //17.5 var expressionCalc = (function () {

  • 1、简述   作为解释性语言,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值。实现的方式就是全局函数eval()。 eval("3+2") // => 5 2、早期的eval()函数   JavaScript语言的早期版本定义了eval()函数,eval()只有一个参数。   如果传入的参数不是字符串,则直接返回这个参数;如果是字符串,则会当成Jav

  • 一、eval 函数概念 eval() 函数十分强大 —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果 作用:eval() 函数会把字符串的引号去掉,然后把中间的内容当作python的代码,然后eval() 函数会执行这一段代码,并且返回执行的结果。 # 基本的数学计算 In [1]: eval("1 + 1") Out[1]: 2 # 字符串重复 In [2]: eval("'*'

  •      eval是Python的一个内置函数,功能十分强大,这个函数的作用是,返回传入字符串的表达式的结果。就是说:将字符串当成有效的表达式 来求值 并 返回计算结果。     eval函数就是实现list、dict、tuple与str之间的转化,同样str函数把list,dict,tuple转为为字符串 1.eval的语法 eval(expression[, globals[, locals]

  • 它的功能是把 对应的字符串解析成JS代码并运行 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行) 由JSON字符串转换为JSON对象的时候可以用eval eval 是全局对象上的一个函数,会把传入的字符串当做 JavaScript 代码执行。如果传入的参数不是字符串,它会原封不动地将其返回。eval 分为直接调用和间接调用两种,通常间接调用的性能会好于直接调用。 直接

 相关资料
  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 主要内容:解释器的创建PyCharm包括解释器,以便根据需要创建具有新功能的新项目。 您可以根据需要在系统中创建虚拟环境。也可以在对话框中继承全局网站包。解释器可在Python Package Index(PyPI)上找到,并且可以使用轻松安装和访问。 解释器的创建 要创建一个解释器,总是建议在管理所需配置的情况下创建一个新项目。 看看下面的截图以便更好地理解 - 这些参数包括 - 位置 - 它描述了创建虚拟环境的参数

  • Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中。 安装完成后,我们可以将路径 /usr/local/python3/bin 添加到您的 Linux/Unix 操作系统的环境变量中,这样您就可以通过 shell 终端输入下面的命令来启动 Python3 。 $ PATH=$PATH:/us

  • 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。 由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。 CPython 当我们从Python官方网站下载并安装好

  • 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。 由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。 CPython 当我们从Python官方网站下载并安装好

  • 翻译的结果是什么?它会把高级语言变成汇编语言还是机器语言,即二进制代码? 如果是后者,这是否意味着解释语言与介绍集没有关系? 一种语言只能有一个口译员?是因为解释器不做任何优化,所以我们不需要找到更好的解释器吗?

  • 请向我解释为什么我总是得到这个错误: 显然,我只在开发模式下得到它,它不会在我的生产构建中发生,但这非常烦人,我根本不明白在我的开发环境中出现错误不会在prod上显示的好处--可能是因为我缺乏理解。 或者强制使用如下构造函数检测更改:: 但是为什么我总是遇到这个错误呢?我想了解它,这样我就可以避免这些黑客修复在未来。

  • 主要内容:介绍,实现,Expression.java,TerminalExpression.java,OrExpression.java,AndExpression.java,InterpreterPatternDemo.java解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 介绍 意图:给定一个语言,定义它的文法表示,并定义一个解释