Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在vm脚本上下文中传递函数_Javascript_Node.js_V8 - Fatal编程技术网

Javascript 在vm脚本上下文中传递函数

Javascript 在vm脚本上下文中传递函数,javascript,node.js,v8,Javascript,Node.js,V8,假设我有一个如下所示的库模块: module.exports = { increment: function() { count++; } } (function() { lib.increment(); })(); 我想在动态生成的脚本中使用它,如下所示: module.exports = { increment: function() { count++; } } (function() { lib.increment

假设我有一个如下所示的库模块:

module.exports = {
    increment: function() {
         count++;
    }
}
(function() { lib.increment(); })();
我想在动态生成的脚本中使用它,如下所示:

module.exports = {
    increment: function() {
         count++;
    }
}
(function() { lib.increment(); })();
通过在沙箱中传递:

var sandbox = {
    count: 1
    lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
我遇到的一个明显的问题是,一方面我不能要求“lib”,因为lib.js中没有定义“count”;另一方面,如果我在“lib.js”文件的导出上面定义
var count
,那么这个新的
count
变量将受到影响,而不是沙箱中的变量

以下是我希望遵守的限制条件:

  • 对生成的文件使用vm,而不是eval()或require()
  • 在外部文件中定义“lib”
  • 不修改自动生成的脚本,因此不使用
    lib.increment.apply(context)
    或类似工具
到目前为止,我找到的唯一解决方案是将生成的脚本中的
lib
函数作为字符串进行前置,或者直接在
sandbox
对象上定义它们,我发现这是一个不太理想的选项


require
调用中似乎没有任何方法可以传递变量的上下文。

实现这一点的一种方法是让
lib
模块成为一个函数,该函数接受上下文,然后返回正确的接口

lib.js

module.exports = function(context) {
  var count = context.count;
  return {
    increment: function() {
      count++;
    }
  };
};
main.js

var sandbox = {
  count: 1
};
sandbox.lib = require('./lib')(sandbox);
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);

为什么不让
exports
成为一个返回带有/get/set&increment方法的对象的函数呢?或者可以让exports成为一个接受上下文的函数。然后您可以执行
require('./lib')({count:1})
,它将返回一个带有
increment
函数的对象。@MikeC看,这就是为什么您永远不要害怕提问,这实际上是一个很好的建议!
global.count++
你想做什么?@Bergi“global”是什么意思?我需要更改在沙盒中作为上下文传递的一个。