小程序eval替代方案:eval5 1.4.0-1.4.5 发布日志
eval5是基于TypeScript编写的JavaScript解释器,100%支持ES5语法。
支持浏览器、node.js、小程序等 JavaScript 运行环境 。
项目地址: https://github.com/bplok20010/eval5
使用场景
浏览器环境中需要沙盒环境来执行JavaScript代码
浏览器环境控制代码执行时长
不支持eval/Function的JavaScript运行环境,如:微信小程序 示例
更新日志
1.4.5
修复with语句中函数调用时丢失this信息
1.4.4
修复在未使用try-catch情况下出现异常时导致下次调用evaluate时的变量声明错乱问题。
1.4.3
修复 WithStatement 中赋值不生效问题。
rootContext创建调整为:Object.create(options.rootContext),防污染。
1.4.2
新增内置对象:URIError RangeError SyntaxError ReferenceError
修复 assignment 表达式触发对象的getter方法调用
1.4.1
修复再次执行事超时机制失效问题
修复函数表达式赋值时引起的返回值错乱问题
1.4.0
解释器内部eval/Function重写
新增参数 options.rootContext
新增参数 options.globalContextInFunction
移除Interpreter.rootContext
运行原理
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"
}
[代码]
根据节点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效果示例:
[图片]