常规:在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
到目前为止,我尝试使用node的global,vm和process对象,以及各种闭包
另请注意,我只能控制mod.js,而不是main.js(是的,我知道安全隐患)
答案 0 :(得分:1)
根据rednoyz的反馈,我意识到执行的范围是函数“define”而不是模块。所以这是一个修复它的新版本的定义。
exports.define = function(__code) {
eval.call(module, __code);
}
我还测试了以避免我在上一篇文章中犯下的一些错误。
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
答案 1 :(得分:0)
不幸的是,您必须在模块本身的模块中定义要使用的函数,您可以编写一个新函数将这些函数注入模块的范围,
exports.define = function(__code) {
eval(__code);
}
使用新的定义界面
amod.define('func = function(a,b) {
return a + b;
}');
您还可以使用其他模式,例如将所有函数定义定义为对象并将其传递给模块以获取访问权限,或者您可以使用@idbehold建议的全局范围
如果您破解了跨两个模块共享范围的方法,请与我们分享。