在模块内的节点的全局范围中评估代码
一般:在node.js中,如何访问正在执行的文件的作用域?
例如:我有一个模块(mod.js)和一个需要它的文件(main.js)。 从mod.js中我需要做一个eval()来访问main.js的作用域,如下所示:
mod.js:
exports.runCode = function(code) { var x = 1; // do some stuff to x and code return eval(code) + x; }
main.js:
var amod = require('./mod'); var func = function(a,b) { return a + b; } console.log(amod.runCode('2+2')); // works fine console.log(amod.runCode('func()')); // ReferenceError: func is not defined
庆典:
$ node main
到目前为止,我已经尝试过使用节点的全局,虚拟机和进程对象,以及各种闭包
还要注意,我只能控制mod.js,而不是main.js(是的,我意识到安全性的影响)
根据rednoyz的反馈,我意识到执行的范围将是“define”而不是模块的function。 所以这里有一个定义的新版本来修复它。
exports.define = function(__code) { eval.call(module, __code); }
我也进行了testing,以避免我在上一篇文章中犯的一些错误。
var amod = require('./mod'); amod.define("var f=function(a,b) {return a + b;}"); amod.define("var g=function(a,b) {return a*b;}"); console.log(amod.runCode('2+2')); // works fine - 5 console.log(amod.runCode('f(2,3)')); // works fine - 6 console.log(amod.runCode('g(3,4)')); // works fine - 13
不幸的是,你不得不在模块中定义你想在模块中使用的函数,你也许可以写一个新的函数来将它们注入模块的范围,
exports.define = function(__code) { eval(__code); }
使用新的定义界面
amod.define('func = function(a,b) { return a + b; }');
还有其他的模式可以用来把所有的函数定义定义为一个对象,并将其传递给模块来访问,或者你可以像@idbehold
如果你在两个模块之间共享示波器,请与我们分享。