具有全局ReferenceError的节点`vm.runInContext`严格模式仍然设置全局值

时间:2016-06-14 01:06:33

标签: javascript node.js strict

当使用Node的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 }

由于第一个vm.runInContext调用会引发ReferenceError,我预计g根本不会定义,但util.inspect(ctx)清楚地表明它已在上下文中设置。稍后调用vm.runInContext也可以使用g

有人可以解释这里发生了什么吗?这可能很简单,但这种行为让我感到意外。

0 个答案:

没有答案