获取Node.js函数定义

3

我希望从一个js文件中收集定义的函数源代码。这些函数可能很复杂,有许多开放和关闭的括号,因此使用正则表达式将会很难。我只需要后面能被调用的函数,像下面这样的

function dump_vars() {
    Object.keys(global).forEach(function (key) {
        console.log(key);
        console.log(global[key]);
    });
}

有没有一种方法可以在node.js中获取函数定义?它们是否保存在全局对象之类的地方?
1个回答

6

如果您可以访问函数对象,则可以使用 .toString() 方法获取其定义。根据 Mozilla 的文档

也就是说,toString 反编译了函数,返回的字符串包括函数关键字、参数列表、花括号和函数体的源代码。

例如,假设您在 mymodule.js 中定义了一个模块:

function add (a, b) {
    return a + b;
};

function mul (a, b) {
    return a * b;
};

module.exports = {
    a: add,
    b: mul
};

然后,在index.js中:
var mymodule = require('./mymodule.js')

Object.keys(mymodule).forEach(function (fun) {
    console.log(mymodule[fun].toString());
})

这将输出:
$ node index.js
function add(a, b) {
    return a + b;
}
function mul(a, b) {
    return a * b;
}

编辑:例如,这就是AngularJS如何实现依赖注入的方式,通过使用.toString()来获取函数代码,以了解函数参数的名称。请参见这个相关的SO答案


我不知道函数的名称,代码也不是我的,所以我会用正则表达式获取函数名称,然后在它们上面运行toString方法?这是个好主意。我会告诉你结果如何 :) - Evan
不,我的意思是您可以在任何函数对象上运行.toString(),例如当您导入模块时获得的函数(我认为这就是您说“只需要在代码后面可调用的函数”时想要做的事情)。 - Paul Mougel
我不能确定模块的其余语法是否正确。 - Evan
你想在源文件上工作还是在require()调用的结果上工作?你的问题不够清晰。 - Paul Mougel
这是一个源文件,我猜测代码不一定需要运行,它可能包含想要执行的代码,而不仅仅是函数定义。这很复杂,但你对于在每个函数名称上运行toString的想法应该可行,谢谢。我会选择你的答案作为正确的答案。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接