Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取nodejs函数定义_Javascript_Node.js - Fatal编程技术网

Javascript 获取nodejs函数定义

Javascript 获取nodejs函数定义,javascript,node.js,Javascript,Node.js,我想从js文件中收集已定义函数的源代码。这些函数可能很复杂,并且有许多开始和结束括号,因此使用正则表达式将很困难。我只需要稍后在代码中可以调用的函数,如下所示 function dump_vars() { Object.keys(global).forEach(function (key) { console.log(key); console.log(global[key]); }); } 有没有办法从node.js中获取函数定义?它们是否保存

我想从js文件中收集已定义函数的源代码。这些函数可能很复杂,并且有许多开始和结束括号,因此使用正则表达式将很困难。我只需要稍后在代码中可以调用的函数,如下所示

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

有没有办法从node.js中获取函数定义?它们是否保存在全局对象的某个位置?

如果您可以访问函数对象,则可以使用
.toString()
方法获取其定义。Per:

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

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

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

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

module.exports = {
    a: add,
    b: mul
};
var mymodule = require('./mymodule.js')

Object.keys(mymodule).forEach(function (fun) {
    console.log(mymodule[fun].toString());
})
然后,在
index.js
中:

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

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

module.exports = {
    a: add,
    b: mul
};
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()
获取函数代码以了解函数参数的名称来实现依赖项注入的。请参阅。

我不知道函数名,代码不是我的,所以我会使用正则表达式获取函数名,然后在它们上运行toString方法?这是个好主意。我会让你知道结果是什么:)不,我的意思是你可以在任何函数对象上运行
.toString()
,比如你导入模块时得到的函数(我想这就是你说“只需要以后在代码中调用的函数”时想要做的事情)我不能确定模块的其余语法是否正确。您想处理源文件还是处理
require()
调用的结果?你的问题还不清楚。我想这是一个源文件,代码不必运行,它可能包括可能要执行此操作的代码,而不仅仅是函数定义。这很复杂,您在每个函数名上运行toString的想法应该是可行的,thnx。我认为你的答案是正确的。