Подтвердить что ты не робот

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

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

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

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

Спасибо заранее!

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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 будет массивом имен аргументов теста i.e. ['a', 'b', 'c']

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

Ответ 3

можно получить все формальное имя параметра 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 и соответствующий unit test в https://github.com/angular/angular.js/blob/master/auto/injectorSpec.js)

Ответ 4

Проверить только требуемые символы. с func.toString(). regex вы проверили полную длину .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(',')
}

Ответ 5

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

Рассмотрим

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

Тогда

alert(f);

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

Ответ 6

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

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

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

Ответ 7

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