如何使用javascript从字符串中解析函数体?

时间:2017-04-19 10:46:47

标签: javascript node.js regex string

我正在寻找一种从js代码字符串中按名称获取函数声明体的方法。我在Nodejs环境中。 我们说我有一些spaghetti.js文件。我可以把它读成一个字符串

const allJs = fs.readFileSync('spaghetti.js');

现在我需要一个接收该字符串和函数名的函数,并返回一个包含{ }之间所有内容的字符串。

像这样的东西

allJs = 'let a=1; const b=[2, 3]; function cook(items){return items}; cook(b)';
parseFunction(allJs, 'cook');//'return items'

输入js的复杂性不受限制。

我试图找到一个npm模块,但没有运气。

2 个答案:

答案 0 :(得分:1)

您应该查看Javascript的AST解析器:

http://esprima.org/

https://github.com/ternjs/acorn

这比使用RegExp或其他东西更安全。

答案 1 :(得分:0)

可以使用本机eval()方法在本地评估String。但请记住,eval is a form of evil

如果上面的parseFunction()依赖于something like this,那么正在使用全局Function constructor并且'new'函数绑定到该操作的返回值(因此返回价值本身需要被称为)。

实现这一目标的一种简单方法可能是做这样的事情......

var funcString = 'var a = 1, b = 3;';
funcString += 'function summit(){return a + b;}';
funcString += 'return summit();';

function makeNewFunc(str) {
    return new Function(str);
}

var newFunc = makeNewFunc( funcString );

console.log('newFunc:',newFunc);
//-> newFunc: function anonymous()

console.log('newFunc():',newFunc());
//-> newFunc(): 4

这演示了如何从String片段创建和调用函数。 (编辑:Turning something like that into a Node module is a simple matter);

希望有所帮助。 :)