eval5
Китайский | Английский
Основанный на TypeScript интерпретатор JavaScript, поддерживающий полный синтаксис ES5.
Поддерживает браузеры, Node.js, мини-программы и другие среды выполнения JavaScript.
eval
или Function
: например, для мини-программ WeChat, We-Script и Taro-Script.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;
}
Пример:
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();
`);
Причина: пример кода:
Примечание: предупреждение об ошибке
import { Interpreter } from "Interpreter";
Interpreter.globalContextInFunction = {};
const ctx = {alert: alert};
const interpreter = new Interpreter(ctx);
interpreter.evaluate(`
// throw Illegal invocation
alert('Hello eval5'); // аналогично alert.call({}, 'Hello eval5')
`);
constructor(context = Interpreter.global, options?: Options )
Конструктор.
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
в качестве значений по умолчанию и создаёт новый интерпретатор. ```
console.log(func(100, 200)); // 300
## vm
Просмотреть [vm](https://nodejs.org/dist/latest-v13.x/docs/api/vm.html)
- vm.createContext
- vm.compileFunction
- vm.runInContext
- vm.runInNewContext
- vm.Script
## License
MIT
## 相关
- [evaljs](https://github.com/marten-de-vries/evaljs)
- [closure-interpreter](https://github.com/int3/closure-interpreter)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )