有没有办法动态获取函数的函数参数名?
假设我的函数如下所示:
function doSomething(param1, param2, .... paramN){
// fill an array with the parameter name and value
// some other code
}
现在,我如何从函数内部将参数名称及其值的列表放入数组中?
最佳答案
以下函数将返回传入的任何函数的参数名称数组。
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var ARGUMENT_NAMES = /([^\s,]+)/g;
function getParamNames(func) {
var fnStr = func.toString().replace(STRIP_COMMENTS, '');
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
if(result === null)
result = [];
return result;
}
示例用法:
getParamNames(getParamNames) // returns ['func']
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']
getParamNames(function (a,/*b,c,*/d){}) // returns ['a','d']
getParamNames(function (){}) // returns []
编辑:
随着 ES6 的发明,这个函数可以被默认参数触发。这是一个在大多数情况下应该有效的快速技巧:
var STRIP_COMMENTS = /(\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s*=[^,\)]*(('(?:\\'|[^'\r\n])*')|("(?:\\"|[^"\r\n])*"))|(\s*=[^,\)]*))/mg;
我说大多数情况是因为有些事情会把它绊倒
function (a=4*(5/3), b) {} // returns ['a']
编辑: 我还注意到 vikasde 也需要数组中的参数值。这已经在名为 arguments 的局部变量中提供。
参数对象不是数组。它类似于数组,但除了长度之外没有任何数组属性。例如,它没有 pop 方法。但是它可以转换为真正的数组:
var args = Array.prototype.slice.call(arguments);
如果数组泛型可用,可以使用以下代替:
var args = Array.slice(arguments);
关于javascript - 如何动态获取函数参数名称/值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64191960/