Я прочитал большинство ответов здесь, и я хотел бы добавить свой однострочный.
new RegExp(Function.name+'\\s*\\((.*?)\\)').exec(Function.toString().replace(/\n/g, ''))[1].replace(/\/\*.*?\*\//g, '').replace(/ /g, '')
или
function getParameters(func) {
return new RegExp(func.name+'\\s*\\((.*?)\\)').exec(func.toString().replace(/\n/g, ''))[1].replace(/\/\*.*?\*\//g, '').replace(/ /g, '');
}
или для однострочной функции в ECMA6
var getParameters = func => new RegExp(func.name+'\\s*\\((.*?)\\)').exec(func.toString().replace(/\n/g, ''))[1].replace(/\/\*.*?\*\//g, '').replace(/ /g, '');
__
Допустим, у вас есть функция
function foo(abc, def, ghi, jkl) {
//code
}
Приведенный ниже код вернет "abc,def,ghi,jkl"
Этот код также будет работать с настройкой функции, которую Камило Мартин дал:
function ( A, b
,c ,d
){}
Также с комментарием Буберссона к Ответ Джека Аллана :
function(a /* fooled you)*/,b){}
__
Объяснение
new RegExp(Function.name+'\\s*\\((.*?)\\)')
Это создает Обычный экспонент с new RegExp(Function.name+'\\s*\\((.*?)\\)')
. Я должен использовать new RegExp
, потому что я внедряю переменную (Function.name
, имя целевой функции) в RegExp.
Пример Если имя функции «foo» (function foo()
), RegExp будет /foo\s*\((.*?)\)/
.
Function.toString().replace(/\n/g, '')
Затем он преобразует всю функцию в строку и удаляет все символы новой строки. Удаление новых строк помогает с настройкой функции Камило Мартин дал.
.exec(...)[1]
Это функция RegExp.prototype.exec
. Он в основном соответствует обычному показателю (new RegExp()
) в строке (Function.toString()
). Затем [1]
вернет первую группу захвата , найденную в обычном показателе ((.*?)
).
.replace(/\/\*.*?\*\//g, '').replace(/ /g, '')
Это удалит каждый комментарий внутри /*
и */
и удалит все пробелы.
Если вы хотите превратить все параметры в массив вместо строки, разделенной запятыми, в конце просто добавьте .split(',')
.