Можно ли отразить аргументы функции Javascript?

Можно ли получить все аргументы, которые функция Javascript записывает в , чтобы принять? (Я знаю, что все аргументы функции Javascript являются «необязательными»)? Если нет, можно ли узнать количество аргументов? Например, в PHP можно использовать:

$class = new ReflectionClass('classNameHere');
$methods = $class->getMethods();
foreach ($methods as $method) {
    print_r($method->getParameters());
}

... или что-то в этом роде, я давно не касался PHP, поэтому приведенный выше пример может быть неверным.

Заранее спасибо!

ИЗМЕНИТЬ : К сожалению, мне нужно получить аргументы вне тела функции ... Извините за отсутствие разъяснений, но спасибо за текущие ответы!

24
задан Jonathan Chan 3 August 2011 в 04:41
поделиться

4 ответа

Предположим, что ваша функция имеет имя foo

Возможно ли получить все аргументы, которые написана для поддержки функции Javascript?

arguments[0] - arguments[foo.length-1]

Если нет, то возможно ли получить количество аргументов?

foo.length будет работать

12
ответ дан 28 November 2019 в 22:23
поделиться

можно получить все формальные имена параметров 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 )

18
ответ дан 28 November 2019 в 22:23
поделиться

Теперь, когда вы говорите вне тела функции , я могу только представить, что вы хотите знать, как называются параметры? Потому что что касается значений, вы уже знаете, какие аргументы вы передаете. В других ответах говорилось, что вы можете получить длину функции, которая является числом параметров, которые она явно объявляет. Теперь, если вы хотите узнать имена вне функции, как насчет хака toString?

Рассмотрим

function f(oh, hi, there) {
    return hi + there / oh;
}

Затем

alert(f);

Что ты видишь? Правильно, просто перепроверьте их! Хорошо, извините, чтобы поднять это. Возможно, это не стандартный ECMAScript, но он работает в Chrome ....

1
ответ дан 28 November 2019 в 22:23
поделиться

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){}));
0
ответ дан 28 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: