在 vm 脚本上下文中传递函数
Pass functions in a vm script context
假设我有一个看起来像这样的库模块:
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",因为"count"没有在lib中定义.js;另一方面,如果我在"lib.js"文件的导出上方定义var count
,这个新的count
变量将受到影响,而不是沙箱中的变量。
以下是我想遵守的约束:
- 在生成的文件上使用 vm 而不是 eval() 或 require()
- 在外部文件中定义"lib"
- 无需修改自动生成的脚本,因此不使用
lib.increment.apply(context)
或类似内容
到目前为止,我找到的唯一解决方案是在生成的脚本中将lib
函数作为字符串预置,或者直接在sandbox
对象上定义它们,我认为这是一个不太理想的选择。
似乎没有任何方法可以在require
调用中传递变量的上下文。
实现
此目的的一种方法是让您的lib
模块成为一个函数,该函数接受上下文然后返回正确的接口。
库.js
module.exports = function(context) {
var count = context.count;
return {
increment: function() {
count++;
}
};
};
主.js
var sandbox = {
count: 1
};
sandbox.lib = require('./lib')(sandbox);
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
相关文章:
- 如何传递函数中的参数
- 如何在单击、Knockout时传递函数中的值
- D3选择html——传递函数时,索引从1开始,而不是从0开始
- 在谷歌地图的addListener事件中传递函数
- 如何在javascript中设置传递函数
- 什么's调用函数和传递函数的区别
- node.js中的箭头函数上下文
- 在Angular Directive中传递函数作为参数不会;不起作用
- Skrollr:当滚动位置在最后一个关键帧之后时传递函数
- 在JS中传递函数作为参数,并访问接收函数's变量
- 如何在aspx页面中的转发器ItemDataBound中传递函数中的Control.ClientID
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- WaveShaperNode的传递函数
- 在 .on('click') 事件处理程序中传递函数和函数参数
- Java 脚本 eval() 函数属于哪个对象?此外,在调用 eval() 函数时传递执行上下文
- Javascript Ninja:数组中的当前元素作为函数上下文
- 通过 x 标记访问器传递函数
- 传递函数,包括javascript中的上下文
- 将变量传递给函数上下文
- Javascript:使用函数上下文与作为参数传递的好处是什么?