中文 | English
A JavaScript interpreter written in TypeScript, Supports full ES5 syntax.
Support JavaScript running environment such as browser, node.js, WeChat Mini Program, etc
- Need to execute code in the browser with a sandbox environment
- Controlling execution time
- JavaScript runtime environment that does not support
eval
andFunction
. for example: WeChat Mini Program demo - Be interested or Be curious
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 {
// default: 0 not limited
timeout?: number;
// readonly
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
current version
global
default: {}
global context
Interpreter.global = window;
const interpreter = new Interpreter();
interpreter.evaluate('alert("hello eval5")');
globalContextInFunction
default: undefined
eval5
does not support use strict
mode, but the default value of this
in function calls is undefined
, you can set this property as the default.
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(ctx);
interpreter.evaluate(`
this; // ctx
function func(){
return this; // window
}
func();
`);
Let's take a look at the following example
Note: Illegal invocation
that's why
globalContextInFunction
is set toundefined
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 = Interpreter.global, options?: Options )
evaluate(code: string): any
executes string code and returns the value of the last expression
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
alias of evaluate
getExecutionTime(): number
get the last execution time
setExecTimeout(timeout: number = 0): void
set the timeout for each execution
getOptions(): Readonly<Options>
get interpreter options
executes string code and returns the value of the last expression
note: a new interpreter is created with every execution
import { evaluate } from "eval5";
evaluate(
`
var a = 100;
var b = 100;
console.log(a+b);
`,
{ console: console }
); // 200
evaluate(`
a;
`); // a is not defined
use Interpreter.global
as the default context, Interpreter.globalContextInFunction
also
import { Function } from "eval5";
const func = new Function("a", "b", "return a+b;");
console.log(func(100, 200)); // 300
see vm
- vm.createContext
- vm.compileFunction
- vm.runInContext
- vm.runInNewContext
- vm.Script
MIT