知识共享许可协议
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。

Node.js v4.2.4 手册 & 文档


执行 JavaScript#

稳定度: 3 - 稳定

你可以这样引入此模块:

var vm = require('vm');

JavaScript 代码可以被编译并立即执行,也可以在编译后保存,留到稍后执行。

vm.runInThisContext(code, [options])#

vm.runInThisContext()code 进行编译、运行并返回结果。 被运行的代码没有对本地作用域 (local scope) 的访问权限,但是可以访问当前的 global 对象。

使用 vm.runInThisContexteval 分别执行相同的代码:

// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'

vm.runInThisContext 无法访问本地作用域,因此 localVar 没有被改变。 eval 可以访问本地作用域,因此 localVar 被改变。

这种情况下 vm.runInThisContext 可以看作一种 间接的 eval 调用, 如 (0,eval)('code')。但是 vm.runInThisContext 也提供下面几个额外的参数:

  • filename: 允许您更改显示在站追踪 (stack trace) 中的文件名
  • displayErrors: 是否在抛出异常前输出带高亮错误代码行的错误信息到 stderr。 将会捕捉所有在编译 code 的过程中产生的语法错误以及执行过程中产生的运行时错误。 默认为 true
  • timeout: 以毫秒为单位规定 code 允许执行的时间。在执行过程中被终止时会有 Error 抛出。

vm.createContext([sandbox])#

如提供 sandbox 对象则将沙箱 (sandbox) 对象 “上下文化 (contextify)” 供 vm.runInContext 或者 script.runInContext 使用。 以此方式运行的脚本将以 sandbox 作为全局对象,该对象将在保留其所有的属性的基础上拥有标准 全局对象 所拥有的内置对象和函数。 在由 vm 模块运行的脚本之外的地方 sandbox 将不会被改变。

如果没有提供沙箱对象,则返回一个新建的、没有任何对象被上下文化的可用沙箱。

此函数可用于创建可执行多个脚本的沙箱, 比如,在模拟浏览器的时候可以使用该函数创建一个用于表示 window 全局对象的沙箱, 并将所有 <script> 标签放入沙箱执行。

vm.isContext(sandbox)#

返回沙箱对象是否已经通过 vm.createContext 上下文化 (contextified)

vm.runInContext(code, contextifiedSandbox, [options])#

vm.runInContext 编译 code 放入 contextifiedSandbox 执行并返回执行结果。 被执行的代码对 本地作用域 (local scope) 没有访问权。 contextifiedSandbox 必须在使用前通过 vm.createContext 上下文化,用作 code 的全局对象。

vm.runInContext 使用与 vm.runInThisContext 相同的 选项 (options)

示例:在同一个上下文中编译并执行不同的脚本

// { globalVar: 1024 }

执行不可信代码 (untrusted code) 是一件充满技巧而且需要非常小心的工作。 vm.runInContext 十分好用,但是安全地运行不可信代码还需要将这些代码放入单独的进程里面执行。

vm.runInNewContext(code, [sandbox], [options])#

vm.runInNewContext 首先编译 code,若提供 sandbox 则将 sandbox 上下文化,若未提供则创建一个新的沙箱并上下文化, 然后将代码放入沙箱作为全局对象的上下文内执行并返回结果。

vm.runInNewContext 使用与 vm.runInThisContext 相同的 选项 (options)

示例: 编译并执行一段“自增一个全局变量然后创建一个全局变量”的代码。这些被操作的全局变量会被保存在沙箱中。

// { animal: 'cat', count: 3, name: 'kitty' }

执行不可信代码 (untrusted code) 是一件充满技巧而且需要非常小心的工作。 vm.runInNewContext 十分好用,但是安全地运行不可信代码还需要将这些代码放入单独的进程里面执行。

类: Script#

用于存放预编译脚本的类,可将预编译代码放入沙箱执行。

new vm.Script(code, options)#

创建一个新的 Script 用于编译 code 但是不执行。使用被创建的 vm.Script 用来表示完成编译的代码。 这份可以在后面的代码中执行多次。 返回的脚本是未绑定任何全局对象 (上下文 context) 的,全局对象仅在每一次执行的时候被绑定,执行结束后即释放绑定。

创建脚本的选项 (option) 有:

  • filename: 允许您更改显示在站追踪 (stack trace) 中的文件名
  • displayErrors: 是否在抛出异常前输出带高亮错误代码行的错误信息到 stderr。 仅捕捉所有在编译过程中产生的语法错误(运行时错误由运行脚本选项控制)。

script.runInThisContext([options])#

类似 vm.runInThisContext 只是作为预编译的 Script 对象方法。 script.runInThisContext 执行被编译的 script 并返回结果。 被运行的代码没有对本地作用域 (local scope) 的访问权限,但是可以访问当前的 global 对象。

示例: 使用 script.runInThisContext 编译代码并多次执行:

// 1000

运行脚本的选项 (option) 有:

  • displayErrors: 是否在抛出异常前输出带高亮错误代码行的错误信息到 stderr。 仅捕捉所有执行过程中产生的运行时错误(语法错误会在 Script 示例创建时就发生,因此不可能创建出带语法错误的 Script 对象)。
  • timeout: 以毫秒为单位规定 code 允许执行的时间。在执行过程中被终止时会有 Error 抛出。

script.runInContext(contextifiedSandbox, [options])#

类似 vm.runInContext 只是作为预编译的 Script 对象方法。 script.runInContextcontextifiedSandbox 中执行 script 编译出的代码,并返回结果。 被运行的代码没有对本地作用域 (local scope) 的访问权限。

script.runInContext 使用与 script.runInThisContext 相同的 选项 (option)。

示例: 编译一段“自增一个全局变量然后创建一个全局变量”的代码,然后多次执行此代码, 被操作的全局变量会被保存在沙箱中。

// { animal: 'cat', count: 12, name: 'kitty' }

执行不可信代码 (untrusted code) 是一件充满技巧而且需要非常小心的工作。 script.runInContext 十分好用,但是安全地运行不可信代码还需要将这些代码放入单独的进程里面执行。

script.runInNewContext([sandbox], [options])#

类似 vm.runInNewContext 但是作为预编译的 Script 对象方法。 若提供 sandboxscript.runInNewContextsandbox 上下文化,若未提供,则创建一个新的上下文化的沙箱, 然后将代码放入沙箱作为全局对象的上下文内执行并返回结果。

script.runInNewContext 使用与 script.runInThisContext 相同的 选项 (option)。

示例: 编译一段“写入一个全局变量”的代码,然后将代码放入不同的上下文 (context) 执行,这些被操作的全局变量会被保存在沙箱中。

// [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]

执行不可信代码 (untrusted code) 是一件充满技巧而且需要非常小心的工作。 script.runInNewContext 十分好用,但是安全地运行不可信代码还需要将这些代码放入单独的进程里面执行。