如何提取函数内部使用的多个方法名
how to extract mulitple method names which are used inside of a function
我从ui ace中得到一个字符串形式的Javascript函数,如下所示,
aceCode = "function funtionName(){ methodAdd(4,8); methodSub(8,4)}";
我只想从aceCode
中提取方法名称作为methodAdd,methodSub
,他们有这样做的选择吗?
仅使用正则表达式自行解析JavaScript是非常非常脆弱的。使用适当的JavaScript解析器,如Esprima,然后扫描抽象语法树。
function findFunctionCalls(ast) {
if (Array.isArray(ast)) {
return Array.prototype.concat.apply([], ast.map(findFunctionCalls));
} else if (ast.type == "CallExpression") {
return [ast.callee.name];
} else if (ast.type == "ExpressionStatement") {
return findFunctionCalls(ast.expression);
} else if (ast.body) {
return findFunctionCalls(ast.body);
} else {
console.error("Oops, I didn't cover that case (" + ast.type + ")");
return [];
}
}
var aceCode = "function funtionName(){ methodAdd(4,8); methodSub(8,4)}";
var ast = esprima.parse(aceCode);
console.log(findFunctionCalls(ast));
<script src="https://cdn.rawgit.com/jquery/esprima/2.7.1/esprima.js"></script>
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
这是一个极小的片段,用来展示发布的极小示例的想法;它可能没有涵盖所有的节点类型,但对缺失的节点类型进行扩展是很琐碎的。
使用正则表达式的方法是:
'b('w+)'(
也就是说,寻找一个单词边界('b
),捕获一个组中的每个单词字符('w
),后面跟着一个括号。看看这里的工作演示。
要只获取花括号内的methodAdd
、methodSub
和一般函数,可以将正则表达式更改为:
('w*)'([^)]*')(?!{)
请在此处查看此解决方案的另一个工作演示。提示:感谢Harpreet Singh指出第一个没有正常工作。
相关文章:
- 可以“;超级“;可以在子类的方法内部使用,在不直接引用的情况下调用相应的超类方法
- 如何从方法内部获取js方法名称
- 方法不在另一个方法内部调用
- 在模式方法内部,“this”在猫鼬 4.4.12 中为空 {}
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 从对象方法内部的数组中运行console.log
- 从方法内部设置对象变量
- 在方法内部调用另一个方法 ReactJS
- 取消对象方法内部的动画帧不起作用
- GetVariable在方法内部工作
- HTTP GET位于客户端调用的api方法内部
- OOP,命名空间的顶级方法内部的私有函数
- Wicket:将JavaScript附加到非Ajax按钮(onSubmit()方法内部)
- 带有查询参数的节点js-app.get方法-内部服务器错误
- 数组排序方法内部的作用域
- 如何在JavaScript中访问继承方法内部的私有属性
- Cordova插件的执行方法内部的AsyncTask工作不正常
- 访问方法内部的变量's函数
- 如何从resolve方法内部更新作用域
- Javascript:从对象方法内部调用回调函数,产生意想不到的结果