我正在运行带有自定义上下文的vm.Script,它提供了另一种运行另一个vm.Script的方法。
我想将第一个vm.Script的上下文传递给第二个vm.Script。
但是,当我测试以下内容时:
var util = require('util');
var vm = require('vm');
var code1 = 'debug(this);'
+ '(function(val) {'
+ ' this.test = 2;'
+ ' lib.increment();'
+ ' lib.subcall(this);'
+ '})();'
var code2 = 'debug(this);';
var context = {
count: 1,
subcall: function(scope) {
console.log(util.inspect(scope));
var script = new vm.Script(code2);
script.runInNewContext(scope);
}
};
var sandbox = {
context: context,
lib: require('./lib')(context),
debug: function(message) { console.log(util.inspect(message)); }
}
var script = new vm.Script(code1);
script.runInNewContext(sandbox);
lib
模块包含:
module.exports = function(context) {
return {
increment: function() {
context.count++;
},
subcall: function(scope) {
context.subcall(scope);
}
};
};
我在code2
vm.Script中找到了一个ReferenceError (未定义调试)。
输出结果为:
// debug(this) inside code1
{ context: { count: 1, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
// console.log inside subcall
{ test: 2,
context: { count: 2, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
基本上我希望运行具有相同上下文的第二个代码,第一个代码中分配的test
字段将被添加到其中。
为什么不是这样?
答案 0 :(得分:1)
如果您设置
this.debug = debug;
,即在code1
中的匿名函数内,您可以访问第二个沙箱中的debug()
。
在我看来debug()
应该可以使用code2
。可以将您的案例添加到此问题node#6283。