eval
应用
使用方式
let name = 'ruijie';
eval('console.log(name)')
// 输出 ruijie
特点
如上述例子,eval 的执行环境是不干净的,会查找当前执行环境的上下文环境。
Function 构造函数
应用
使用方式
let b = 10;
let a = 'let a = 1;console.log("ruijie") return x + y + e + a';
let fn = new Function('x', 'y','e', a );
console.log(fn(1,2,3));
/* 输出
ruijie
7
*/
特点
最后一个参数是字符串,前面的参数是入参。
执行环境与外界隔离,只能访问全局的变量如 console,不能访问局部变量如 b。
Node.js 中vm模块
应用
使用方式
vm.runInThisContext
在当前执行上下文中运行,与外界隔离,不能访问局部变量(如:a),能够访问全局变量(如:console)。
let vm = require('vm');
let a = 'ruijie';
//vm.runInThisContext('console.log(a)');//报错 a 为定义
vm.runInThisContext('console.log(“ruijie”)');//ruijie
vm.runInNewContext
在新的执行上下文中运行,局部变量和全局变量都不能访问,需要通过 sandBox 传入。
let vm = require('vm');
vm.runInNewContext('console.log("name")',{console})
vm.runInContext
创建一个独立的沙箱运行空间,只不过他的 sandBox 需要用 vm.createContext 创建。
let sandBox = vm.createContext({console})
vm.runInContext('let a = 1;console.log(a)', sandBox)