eval5JavaScript 解释器
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
评论