vm.runInThisContext(code[, options])
code<string> 用于编译和运行的 JavaScript 代码。options<Object> | <string>filename<string> 指定此脚本生成的堆栈跟踪中使用的文件名。默认值:'evalmachine.<anonymous>'。lineOffset<number> 指定此脚本生成的堆栈跟踪中显示的行号偏移。默认值:0。columnOffset<number> 指定此脚本生成的堆栈跟踪中显示的首行列偏移量。默认值:0。displayErrors<boolean> 当设置为true时,如果在编译code时发生Error,导致错误的代码行会附加到堆栈跟踪中。默认值:true。timeout<integer> 指定执行code前的毫秒数,超过此时间将终止执行。如果执行被终止,将抛出一个Error。此值必须是严格正整数。breakOnSigint<boolean> 如果为true,接收到SIGINT(Ctrl+C)将终止执行并抛出一个Error。在脚本执行期间,通过process.on('SIGINT')附加的现有事件处理程序将被禁用,但在脚本执行后仍然继续工作。默认值:false。cachedData<Buffer> | <TypedArray> | <DataView> 提供了一个可选的Buffer、TypedArray或DataView,其中包含所提供源代码的 V8 代码缓存数据。importModuleDynamically<Function> 在评估此模块时被调用,当调用import()时触发。如果未指定此选项,则对import()的调用将因ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING而被拒绝。此选项是实验性模块 API 的一部分。我们不建议在生产环境中使用它。如果未设置--experimental-vm-modules,则此回调将被忽略,并且对import()的调用将因ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG而被拒绝。specifier<string> 传递给import()的指定符script<vm.Script>importAttributes<Object> 传递给optionsExpression可选参数的with值,如果未提供值,则为一个空对象。- 返回值:<Module Namespace Object> | <vm.Module> 推荐返回
vm.Module,以便利用错误跟踪,并避免包含then函数导出的命名空间出现问题。
- 返回:<any> 脚本中最后执行的语句的结果。
vm.runInThisContext() 会编译 code,在当前 global 的上下文中运行它,并返回结果。运行的代码无法访问本地作用域,但可以访问当前的 global 对象。
如果 options 是字符串,那么它指定文件名。
【If options is a string, then it specifies the filename.】
下面的示例说明了如何同时使用 vm.runInThisContext() 和 JavaScript 的 eval() 函数来运行相同的代码:
【The following example illustrates using both vm.runInThisContext() and
the JavaScript eval() function to run the same code:】
const vm = require('node:vm');
let localVar = 'initial value';
const vmResult = vm.runInThisContext('localVar = "vm";');
console.log(`vmResult: '${vmResult}', localVar: '${localVar}'`);
// Prints: vmResult: 'vm', localVar: 'initial value'
const evalResult = eval('localVar = "eval";');
console.log(`evalResult: '${evalResult}', localVar: '${localVar}'`);
// Prints: evalResult: 'eval', localVar: 'eval' 因为 vm.runInThisContext() 无法访问本地作用域,localVar 不会改变。相比之下,eval() 确实可以访问本地作用域,因此 localVar 的值会改变。以这种方式来看,vm.runInThisContext() 很像 间接 eval() 调用,例如 (0,eval)('code')。
【Because vm.runInThisContext() does not have access to the local scope,
localVar is unchanged. In contrast, eval() does have access to the
local scope, so the value localVar is changed. In this way
vm.runInThisContext() is much like an indirect eval() call, e.g.
(0,eval)('code').】