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

如何使用javascript从字符串解析函数体?,javascript,node.js,regex,string,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)';

我正在寻找一种从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模块,但没有运气

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


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

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


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

可以使用本机方法在本地计算
字符串。但是记住

如果上面的
parseFunction()
依赖于,则将使用全局函数,“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
代码段创建和调用函数。(编辑:)


希望有帮助。:)

A
String
可以使用本机方法在本地进行计算。但是记住

如果上面的
parseFunction()
依赖于,则将使用全局函数,“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
代码段创建和调用函数。(编辑:)


希望有帮助。:)

parseFunction
的第二个参数(“cook”)是用于什么的?如果输入js的复杂性不受限制,则应指定所需的函数体。所有,只是第一个,一个特殊的,甚至是嵌套的,类方法等等…?@Jamiec这是一个要在输入代码中查找的函数名,但您的字符串输入已经包括对
cook
的调用。可能你的意思是
returncook(b)否?@dsuckau,假设我只需要顶级函数声明。没有类、方法等。
parseFunction
的第二个参数(“cook”)是什么?如果输入js的复杂性不受限制,则应指定所需的函数体。所有,只是第一个,一个特殊的,甚至是嵌套的,类方法等等…?@Jamiec这是一个要在输入代码中查找的函数名,但您的字符串输入已经包括对
cook
的调用。可能你的意思是
returncook(b)否?@dsuckau,假设我只需要顶级函数声明。没有类、方法等。看来你还没有理解我的问题。我不想引用任何东西。我只想得到一个表示特定函数体的字符串。简单的文本。您可以将其视为某种形式的静态代码分析。@Andrey-我接受了您的问题,它的标题,以及建议的
parseFunction
函数,意思是您希望从字符串中解析函数。如果您想提取函数体的字符串表示形式,那么您正在进行“函数反编译”-请参见下面的回答:似乎您还没有理解我的问题。我不想引用任何东西。我只想得到一个表示特定函数体的字符串。简单的文本。您可以将其视为某种形式的静态代码分析。@Andrey-我接受了您的问题,它的标题,以及建议的
parseFunction
函数,意思是您希望从字符串中解析函数。如果您想提取函数体的字符串表示形式,那么您需要执行“函数反编译”-请参见下面的答案: