可能重复:
How to get function parameter names/values dynamically from javascript
我目前正在研究一个javascript(node.js)项目,我试图从函数中获取一个参数名称(非值,我不需要参数)的数组。我目前正在使用Function.toString()获取函数字符串,然后运行正则表达式以获取我的参数列表。
我们采取以下简单的例子:
var myFunction = function (paramOne, paramTwo) { ... }
运行我的正则表达式,然后做一些字符串魔法(拆分等)我希望像这样的数组:
paramList = ['paramOne', 'paramTwo']
我有一些有用的东西,但我觉得它可能不是最好的解决方案,因为一些时髦的字符javascript允许你使用变量名称,javascript将让你在多行上定义函数。
以下是我目前的情况:
function.*[\w\s$]*(\((.*[\w\s,$]*)\))
这给了我第1组中的“匹配”,然后是第2组中没有任何parens的参数列表,这很酷。这真的是做我想要的最好的方式吗?我可以使用更好的正则表达式吗?我并不是在寻找“更简单”的东西,而是真正能够捕捉所有可能情况的东西。
任何帮助将不胜感激,并提前多多感谢!
答案 0 :(得分:20)
最简单的方法是捕获第一组parens中的所有内容,然后使用split(/\s*,\s*/)
来获取数组。
E.g:
var str = "function( one ,\ntwo,three , four ) { laksjdfl akjsdflkasjdfl }";
var args = /\(\s*([^)]+?)\s*\)/.exec(str);
if (args[1]) {
args = args[1].split(/\s*,\s*/);
}
snippet.log("args: " + JSON.stringify(args));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
以上如何运作:
我们使用/\( *([^)]+?) *\)/
来匹配第一个左括号(\(
,因为(
在正则表达式中是特殊的),后跟任意数量的可选空格,后跟捕获组捕获除了右括号(但非贪婪)之外的所有内容,后跟任意数量的可选空格,然后是结束)
。
如果我们成功,我们使用/\s*,\s*/
进行拆分,这意味着我们拆分了零个或多个空格字符(\s*
)的序列,后跟逗号后跟零个或多个空格字符(这个空白的东西就是为什么我的示例函数中的args非常奇怪)。
从示例中可以看出,它处理前导空格(在(
之后和第一个参数之前),逗号周围的空格和尾随空格 - 包括换行符。 不尝试处理参数列表中的注释,这会使事情明显复杂化。
附注:请务必在目标浏览器上进行测试,Function#toString
返回某种形式的源代码是非标准功能。它受到广泛支持(在桌面浏览器中),但不是标准的。请注意,某些浏览器会包含注释,而其他浏览器则不会如果有人在函数参数中包含注释,它可能会搞砸你对它们的解析。你可能会开始Prototype source code for its Function#argumentNames
extension,因为他们已经沿着这条路走了......
答案 1 :(得分:3)
执行以下操作:
var ar = str.match(/\((.*?)\)/);
if (ar) {
var result = ar[0].split(",");
}
记得吗?之后*做了非贪婪的发现
答案 2 :(得分:2)
我建议你使用正则表达式:
/function[^(]*\(([^)]*)\)/
将匹配参数列表/\W+/
(针对第一个匹配数据的结果)会将匹配拆分为参数列表因此,代码应如下所示:
var s = "function moo (paramOne, paramTwo) { alert('hello'); }";
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1];
var paramList = s2.split(/\W+/);