【问题标题】:How to parse functions bodies from a string using javascript?如何使用javascript从字符串中解析函数体?
【发布时间】:2017-09-15 13:15:04
【问题描述】:

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

【问题讨论】:

  • parseFunction 的第二个参数(“cook”)是什么?
  • 如果你的输入js的复杂度没有限制,你应该指定你想要的函数体。所有,只是第一个,一个特殊的,甚至是嵌套的,类方法等等......?
  • @Jamiec 这是要在输入代码中查找的函数名称
  • 对,但是您的字符串输入已经包含对cook 的调用。可能你的意思是return cook(b); 不?
  • @dsuckau,假设我只想要顶级函数声明。没有类、方法等。

标签: javascript node.js regex string


【解决方案1】:

可以使用本机 eval() 方法在本地评估 String。但请记住,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

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

希望对您有所帮助。 :)

【讨论】:

  • 看来你还没有理解我的问题。我不想调用任何东西。我只想得到一个代表特定函数主体的字符串。一个简单的文字。您可以将其视为某种形式的静态代码分析。
  • @Andrey - 我接受了你的问题,它的标题和建议的parseFunction 函数意味着你正在寻找,你知道,从字符串中解析一个函数。如果你想提取函数体的字符串表示,那么你在“函数反编译”之后 - 请参阅这个 SO 答案:stackoverflow.com/a/3179967/4746328
【解决方案2】:

你应该看看 AST parser for Javascript:

http://esprima.org/

https://github.com/ternjs/acorn

这应该比使用 RegExp 什么的更安全。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2015-04-22
    • 2016-05-15
    • 1970-01-01
    • 2016-06-25
    • 2015-03-10
    • 2012-06-21
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多