script.runInNewContext([contextObject[, options]])
-
contextObject<Object> | <undefined>vm.constants.DONT_CONTEXTIFY或将成为 contextified 的对象。如果是undefined,将创建一个空的上下文化对象以实现向后兼容。¥
contextObject<Object> | <undefined> Eithervm.constants.DONT_CONTEXTIFYor an object that will be contextified. Ifundefined, an empty contextified object will be created for backwards compatibility. -
options<Object>-
displayErrors<boolean> 当为true时,如果编译code时出现Error,则导致错误的代码行会附加到堆栈跟踪中。默认值:true。¥
displayErrors<boolean> Whentrue, if anErroroccurs while compiling thecode, the line of code causing the error is attached to the stack trace. Default:true. -
timeout<integer> 指定终止执行前执行code的毫秒数。如果执行终止,则将抛出Error。此值必须是严格的正整数。¥
timeout<integer> Specifies the number of milliseconds to executecodebefore terminating execution. If execution is terminated, anErrorwill be thrown. This value must be a strictly positive integer. -
breakOnSigint<boolean> 如果是true,接收SIGINT(Ctrl+C)将终止执行并抛出Error。已通过process.on('SIGINT')附加的事件的现有句柄在脚本执行期间被禁用,但在此之后继续工作。默认值:false。¥
breakOnSigint<boolean> Iftrue, receivingSIGINT(Ctrl+C) will terminate execution and throw anError. Existing handlers for the event that have been attached viaprocess.on('SIGINT')are disabled during script execution, but continue to work after that. Default:false. -
contextName<string> 新创建的上下文的可读名称。默认值:'VM Context i',其中i是所创建上下文的升序数字索引。¥
contextName<string> Human-readable name of the newly created context. Default:'VM Context i', whereiis an ascending numerical index of the created context. -
contextOrigin<string> 起源 对应于新创建的上下文,用于显示目的。来源的格式应该像 URL,但只有协议、主机和端口(如果需要),就像URL对象的url.origin属性的值。最值得注意的是,该字符串应省略尾部斜杠,因为它表示路径。默认值:''。¥
contextOrigin<string> Origin corresponding to the newly created context for display purposes. The origin should be formatted like a URL, but with only the scheme, host, and port (if necessary), like the value of theurl.originproperty of aURLobject. Most notably, this string should omit the trailing slash, as that denotes a path. Default:''. -
contextCodeGeneration<Object>-
strings<boolean> 如果设置为 false,则任何对eval或函数构造函数(Function、GeneratorFunction等)的调用都将抛出EvalError。默认值:true。¥
strings<boolean> If set to false any calls toevalor function constructors (Function,GeneratorFunction, etc) will throw anEvalError. Default:true. -
wasm<boolean> 如果设置为 false,则任何编译 WebAssembly 模块的尝试都将抛出WebAssembly.CompileError。默认值:true。¥
wasm<boolean> If set to false any attempt to compile a WebAssembly module will throw aWebAssembly.CompileError. Default:true.
-
-
microtaskMode<string> 如果设置为afterEvaluate,微任务(通过Promise和async function安排的任务)将在脚本运行后立即运行。在这种情况下,它们包含在timeout和breakOnSigint范围内。¥
microtaskMode<string> If set toafterEvaluate, microtasks (tasks scheduled throughPromises andasync functions) will be run immediately after the script has run. They are included in thetimeoutandbreakOnSigintscopes in that case.
-
-
返回:<any> 脚本中最后一条语句执行的结果。
¥Returns: <any> the result of the very last statement executed in the script.
此方法是 script.runInContext(vm.createContext(options), options) 的快捷方式。它同时做几件事:
¥This method is a shortcut to script.runInContext(vm.createContext(options), options).
It does several things at once:
-
创建一个新的上下文。
¥Creates a new context.
-
如果
contextObject是一个对象,则使用新上下文对其进行 contextifies 操作。如果contextObject未定义,则创建一个新对象并对其进行 contextifies 操作。如果contextObject是vm.constants.DONT_CONTEXTIFY,则不要 contextify 任何内容。¥If
contextObjectis an object, contextifies it with the new context. IfcontextObjectis undefined, creates a new object and contextifies it. IfcontextObjectisvm.constants.DONT_CONTEXTIFY, don't contextify anything. -
在创建的上下文中运行
vm.Script对象包含的编译代码。代码无权访问调用此方法的范围。¥Runs the compiled code contained by the
vm.Scriptobject within the created context. The code does not have access to the scope in which this method is called. -
返回结果。
¥Returns the result.
以下示例编译设置全局变量的代码,然后在不同的上下文中多次执行代码。全局变量设置并包含在每个单独的 context 中。
¥The following example compiles code that sets a global variable, then executes
the code multiple times in different contexts. The globals are set on and
contained within each individual context.
const vm = require('node:vm');
const script = new vm.Script('globalVar = "set"');
const contexts = [{}, {}, {}];
contexts.forEach((context) => {
script.runInNewContext(context);
});
console.log(contexts);
// Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]
// This would throw if the context is created from a contextified object.
// vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary
// global objects that can be frozen.
const freezeScript = new vm.Script('Object.freeze(globalThis); globalThis;');
const frozenContext = freezeScript.runInNewContext(vm.constants.DONT_CONTEXTIFY);