2017-04-19 127 views
0

我正在寻找一种方法来从一串js代码中获取名称的函数声明主体。我在Nodejs环境中。 假设我有一些spaghetti.js文件。我可以读入一个字符串如何使用javascript解析字符串中的函数体?

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模块,但没有运气。

+1

你的'parseFunction'的第二个参数(“cook”)是什么? – Jamiec

+0

如果输入js的复杂性不受限制,则应指定您想要的函数体。所有,只是第一个,一个特殊的,甚至嵌套的,类方法等...? – dsuckau

+0

@Jamiec这是一个在输入代码 – Andrey

回答

0

A String可以通过本地eval()方法进行本地评估。但请记住,eval is a form of evil

如果parseFunction()以上是依靠something like this则全局Function constructor正在使用,“新的”功能被绑定到该操作的返回值(并且因此本身需要该返回值被调用)。

一种简单的方式来实现,这可能是做这样的事情...

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);

希望有帮助。 :)

+0

看来你还没有明白我的问题。我不想调用任何东西。我只想得到代表某个特定功能主体的STRING。简单的文字。你可以把它看作某种形式的静态代码分析。 – Andrey

+0

@Andrey - 我把你的问题,标题和建议的'parseFunction'函数表示你正在寻找,你知道,从一个字符串解析一个函数。如果你想提取一个函数体的字符串表示,那么你在“函数反编译”之后 - 看到这个回答:http://stackoverflow.com/a/3179967/4746328 –