Можно ли получить все аргументы, которые функция Javascript записывает в , чтобы принять? (Я знаю, что все аргументы функции Javascript являются «необязательными»)? Если нет, можно ли узнать количество аргументов? Например, в PHP можно использовать:
$class = new ReflectionClass('classNameHere');
$methods = $class->getMethods();
foreach ($methods as $method) {
print_r($method->getParameters());
}
... или что-то в этом роде, я давно не касался PHP, поэтому приведенный выше пример может быть неверным.
Заранее спасибо!
ИЗМЕНИТЬ : К сожалению, мне нужно получить аргументы вне тела функции ... Извините за отсутствие разъяснений, но спасибо за текущие ответы!
Предположим, что ваша функция имеет имя foo
Возможно ли получить все аргументы, которые написана для поддержки функции Javascript?
arguments[0]
- arguments[foo.length-1]
Если нет, то возможно ли получить количество аргументов?
foo.length
будет работать
можно получить все формальные имена параметров javascript:
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function formalParameterList(fn) {
var fnText,argDecl;
var args=[];
fnText = fn.toString().replace(STRIP_COMMENTS, '');
argDecl = fnText.match(FN_ARGS);
var r = argDecl[1].split(FN_ARG_SPLIT);
for(var a in r){
var arg = r[a];
arg.replace(FN_ARG, function(all, underscore, name){
args.push(name);
});
}
return args;
}
это можно проверить следующим образом:
var expect = require('expect.js');
expect( formalParameterList(function() {} )).to.eql([]);
expect( formalParameterList(function () {} )).to.eql([]);
expect( formalParameterList(function /* */ () {} )).to.eql([]);
expect( formalParameterList(function (/* */) {} )).to.eql([]);
expect( formalParameterList(function ( a, b, c ,d /* */, e) {} )).to.eql(['a','b','c','d','e']);
Примечание: этот метод используется с $ Инжектор AngularJs и реализован в функции аннотирования. (см. https://github.com/angular/angular.js/blob/master/src/auto/injector.js и соответствующий модульный тест в https://github.com/ angular / angular.js / blob / master / auto / injectorSpec.js )
Теперь, когда вы говорите вне тела функции , я могу только представить, что вы хотите знать, как называются параметры? Потому что что касается значений, вы уже знаете, какие аргументы вы передаете. В других ответах говорилось, что вы можете получить длину функции, которая является числом параметров, которые она явно объявляет. Теперь, если вы хотите узнать имена вне функции, как насчет хака toString
?
Рассмотрим
function f(oh, hi, there) {
return hi + there / oh;
}
Затем
alert(f);
Что ты видишь? Правильно, просто перепроверьте их! Хорошо, извините, чтобы поднять это. Возможно, это не стандартный ECMAScript, но он работает в Chrome ....
args = f => f.toString ()
.replace( /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,'')
.replace(/(\r\n\t|\n|\r\t)/gm,"")
.trim()
.match (/(?:\w*?\s?function\*?\s?\*?\s*\w*)?\s*(?:\((.*?)\)|([^\s]+))/)
.slice (1,3)
.join ('').replace(/\s/g, '').
split (/\s*,\s*/);
/*Test*/
console.log(args((a,b)=>a+b));
console.log(args(function(c,d){return c+d;}));
console.log(args(async function(a,b,c){/**/}));
console.log(args(function* (a,b,c,d){/**/}));
console.log(args(function name(s1,s2){}));
console.log(args(function name(/*comment 1*/ s3/*comment2*/,s4//
){}));
console.log(args(async function* name(/*comment1*/ s5/*comment2*/,s6){}));
console.log(args(async function * name(/*comment1*/ s7/*comment2*/,s8){}));
console.log(args(async function *name(/*comment1*/ s9/*comment2*/,s10){}));