Javascript 节点`vm.runInContext`具有全局引用错误的严格模式仍然设置全局值

Javascript 节点`vm.runInContext`具有全局引用错误的严格模式仍然设置全局值,javascript,node.js,strict,Javascript,Node.js,Strict,使用节点的vm.runInContext计算引用未定义全局变量的严格模式代码时,我看到了意外行为。以下是示例: var vm = require('vm'); var util = require('util'); var ctx = {}; vm.createContext(ctx); try { console.log(vm.runInContext("'use strict'; g = 3;", ctx)); } catch (e) { console.log('err

使用节点的
vm.runInContext
计算引用未定义全局变量的严格模式代码时,我看到了意外行为。以下是示例:

var vm = require('vm');
var util = require('util');

var ctx = {};
vm.createContext(ctx);

try {
    console.log(vm.runInContext("'use strict'; g = 3;", ctx));
} catch (e) {
    console.log('error', e);
}

console.log('----');
console.log(util.inspect(ctx));
其中打印:

error evalmachine.<anonymous>:1
'use strict'; g = 3;
                ^
ReferenceError: g is not defined
    at evalmachine.<anonymous>:1:17
    at Object.exports.runInContext (vm.js:44:17)
    at Object.<anonymous> (C:\Users\matb\Documents\Visual Studio 2015\Projects\NodejsConsoleApp5\NodejsConsoleApp5\app.js:9:20)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Timeout.Module.runMain [as _onTimeout] (module.js:575:10)
    at tryOnTimeout (timers.js:224:11)
-----
{ g: 3 }
错误评估机器:1
"严格使用",;g=3;
^
ReferenceError:未定义g
在评估机器上:1:17
位于Object.exports.runInContext(vm.js:44:17)
反对。(C:\Users\matb\Documents\visualstudio 2015\Projects\NodejsConsoleApp5\NodejsConsoleApp5\app.js:9:20)
在模块处编译(Module.js:541:32)
在Object.Module._extensions..js(Module.js:550:10)
在Module.load(Module.js:458:32)
在tryModuleLoad时(module.js:417:12)
在Function.Module.\u加载(Module.js:409:3)
Timeout.Module.runMain[as _onTimeout](Module.js:575:10)
在tryOnTimeout(timers.js:224:11)
-----
{g:3}
由于第一个
vm.runInContext
调用抛出了一个
ReferenceError
,我希望
g
根本不会被定义,但是
util.inspect(ctx)
清楚地显示它已经在上下文中被设置。以后调用
vm.runInContext
也可以使用
g
很好


有人能解释一下这是怎么回事吗?这可能很简单,但这种行为让我大吃一惊。

您是否尝试过
“‘使用严格’;var g=3;”
“‘使用严格’;让g=3;”
?我相信use strict required variable Declaration我只能猜测操作顺序是先创建一个全局变量,然后应用严格检查。@kiro112这两种方法都能按预期工作,但这个问题是专门针对全局变量的。您是否尝试过“use strict”;var g=3;“或
”‘use strict’;let g=3;”
?我相信使用严格的必需变量声明我只能猜测操作顺序是先创建一个全局变量,然后应用严格的检查。@kiro112这两个都按预期工作,但这个问题是关于全局变量的。