Node.js v4.2.4 手册 & 文档
目录
执行 JavaScript#
稳定度: 3 - 稳定
你可以这样引入此模块:
var vm = require('vm');
JavaScript 代码可以被编译并立即执行,也可以在编译后保存,留到稍后执行。
vm.runInThisContext(code, [options])#
vm.runInThisContext()
对 code
进行编译、运行并返回结果。
被运行的代码没有对本地作用域 (local scope) 的访问权限,但是可以访问当前的 global
对象。
使用 vm.runInThisContext
和 eval
分别执行相同的代码:
// 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.runInContext
在 contextifiedSandbox
中执行 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
对象方法。
若提供 sandbox
则 script.runInNewContext
将 sandbox
上下文化,若未提供,则创建一个新的上下文化的沙箱,
然后将代码放入沙箱作为全局对象的上下文内执行并返回结果。
script.runInNewContext
使用与 script.runInThisContext
相同的 选项 (option)。
示例: 编译一段“写入一个全局变量”的代码,然后将代码放入不同的上下文 (context) 执行,这些被操作的全局变量会被保存在沙箱中。
// [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]
执行不可信代码 (untrusted code) 是一件充满技巧而且需要非常小心的工作。
script.runInNewContext
十分好用,但是安全地运行不可信代码还需要将这些代码放入单独的进程里面执行。