在模块内的节点的全局范围中评估代码

一般:在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

如果你在两个模块之间共享示波器,请与我们分享。