当使用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
。
有人可以解释这里发生了什么吗?这可能很简单,但这种行为让我感到意外。