基于 TypeScript 编写的 JavaScript 解释器
支持浏览器、node.js、小程序等 JavaScript 运行环境
eval
Function
的 JavaScript 运行环境:如 微信小程序 demoES5
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
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)
构造函数
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>
获取解释器参数
执行给定的字符串代码,并返回最后一个表达式的值
注: 该函数每次执行都会创建一个新的解释器
import { evaluate } from "eval5"; evaluate( ` var a = 100; var b = 100; console.log(a+b); `, { console: console } ); // 200 evaluate(` a; `); // a is not defined
该函数会将Interpreter.global
Interpreter.globalContextInFunction
当作默认值并创建新的解释器
import { Function } from "eval5"; const func = new Function("a", "b", "return a+b;"); console.log(func(100, 200)); // 300
查看 vm
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 解析、符号处理引擎等。 介绍 意图:给定一个语言,定义它的文法表示,并定义一个解释