eval

应用

前端模块化

使用方式

  1. let name = 'ruijie';
  2. eval('console.log(name)')
  3. // 输出 ruijie

特点

如上述例子,eval 的执行环境是不干净的,会查找当前执行环境的上下文环境。

Function 构造函数

应用

模版引擎系统,如 ejs、handlebar

使用方式

  1. let b = 10;
  2. let a = 'let a = 1;console.log("ruijie") return x + y + e + a';
  3. let fn = new Function('x', 'y','e', a );
  4. console.log(fn(1,2,3));
  5. /* 输出
  6. ruijie
  7. 7
  8. */

特点

最后一个参数是字符串,前面的参数是入参。
执行环境与外界隔离,只能访问全局的变量如 console,不能访问局部变量如 b。

Node.js 中vm模块

应用

CommonJS 模块化实现

使用方式

vm.runInThisContext

在当前执行上下文中运行,与外界隔离,不能访问局部变量(如:a),能够访问全局变量(如:console)。

  1. let vm = require('vm');
  2. let a = 'ruijie';
  3. //vm.runInThisContext('console.log(a)');//报错 a 为定义
  4. vm.runInThisContext('console.log(“ruijie”)');//ruijie

vm.runInNewContext

在新的执行上下文中运行,局部变量和全局变量都不能访问,需要通过 sandBox 传入。

  1. let vm = require('vm');
  2. vm.runInNewContext('console.log("name")',{console})

vm.runInContext

创建一个独立的沙箱运行空间,只不过他的 sandBox 需要用 vm.createContext 创建。

  1. let sandBox = vm.createContext({console})
  2. vm.runInContext('let a = 1;console.log(a)', sandBox)