Можно ли отразить аргументы функции Javascript? - PullRequest
24 голосов
/ 03 августа 2011

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

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

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

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

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

Ответы [ 8 ]

43 голосов
/ 03 августа 2011

Эта новая версия также поддерживает функции жирной стрелки ...

args = f => f.toString ().replace (/[\r\n\s]+/g, ' ').
              match (/(?:function\s*\w*)?\s*(?:\((.*?)\)|([^\s]+))/).
              slice (1,3).
              join ('').
              split (/\s*,\s*/);

function ftest (a,
                 b,
                 c) { }

let aftest = (a,
                 b,
                 c) => a + b / c;

console.log ( args (ftest),  // = ["a", "b", "c"] 
              args (aftest), // = ["a", "b", "c"]
              args (args)    // = ["f"]
             );

Вот то, что я думаю, вы ищете:

 function ftest (a,
                 b,
                 c) { }
 var args = ftest.toString ().
              replace (/[\r\n\s]+/g, ' ').
              match (/function\s*\w*\s*\((.*?)\)/)[1].split (/\s*,\s*/);

args будет массивомимена аргументов теста, т. е. ['a', 'b', 'c']

Значение args будет массивом имен параметров, если ftest является функцией.Массив будет пустым, если ftest не имеет параметров.Значение args будет null, если ftest не сможет соответствовать регулярному выражению, т. Е. Это не функция.

18 голосов
/ 01 декабря 2012

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

12 голосов
/ 03 августа 2011

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

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

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

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

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

2 голосов
/ 25 сентября 2013

отметьте только необходимые символы.с func.toString (). regex вы проверили full length.so, если функция является классом с 500 строками кода ...

function getParams(func){
    var str=func.toString();
    var len = str.indexOf("(");
    return str.substr(len+1,str.indexOf(")")-len -1).replace(/ /g,"").split(',')
}
1 голос
/ 02 июня 2016

Ответ HBP - это то, что ищет большинство людей, но если вы тот, кто определяет функцию, вы также можете назначить свойство для объекта функции.Например,

a.arguments = ['foo', 'bar', 'baz']
function a(foo, bar, baz) {
  // do stuff
}

Это более спорным ясно, но вам придется писать свои аргументы в два раза.

1 голос
/ 03 августа 2011

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

Рассмотрим

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

Затем

alert(f);

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

0 голосов
/ 27 февраля 2019

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 голосов
/ 03 августа 2011

JavaScript - это диалекты ECMAScript, в соответствии со стандартом ECMAScript, функция также является объектом, и когда функция вызывается, функция может обращаться к объектам аргументов, этот аргумент является объектом, подобным массиву, он имеет свойство длины может использовать arguments.length для прохождения всех аргументов, переданных этой функции. посетите http://interglacial.com/javascript_spec/a-13.html#a-13.2.1 для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...