eval5JavaScript 解释器

联合创作 · 2023-09-23 03:05

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

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报