将上下文从 vm.Script 传递到另一个

Passing context from a vm.Script to another

正在关注

我正在 运行使用自定义上下文创建 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 字段将被添加到其中。

为什么不是这样?

如果你设置

this.debug = debug;

在第 6 行,即在 code1 中的匿名函数内,您可以访问第二个沙箱内的 debug()

在我看来 debug() 应该在 code2 中可用。将您的案例添加到此问题可能会很好node#6283