是否有可能反映Javascript函数的参数?

Jon*_*han 24 javascript reflection methods

是否有可能将Javascript函数的所有参数都写入接受?(我知道所有Javascript函数参数都是"可选的")?如果没有,是否可以获得参数的数量?例如,在PHP中,可以使用:

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

...或类似的东西,我有一段时间没有碰过PHP,所以上面的例子可能不正确.

提前致谢!

编辑:不幸的是,我必须能够在函数体外获取参数...对不起澄清,但感谢您当前的答案!

HBP*_*HBP 43

这个新版本也处理胖箭头功能......

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"]
             );
Run Code Online (Sandbox Code Playgroud)

以下是我认为您正在寻找的内容:

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

args将是测试参数名称的数组,即['a','b','c']

如果ftest是函数,则args将是参数名称的数组.如果ftest没有参数,数组将为空. 如果正则表达式匹配失败,则值args将是,即它不是函数.nullftest


Eti*_*nne 18

有可能获得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;
 }
Run Code Online (Sandbox Code Playgroud)

这可以通过这种方式测试:

 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']);
Run Code Online (Sandbox Code Playgroud)

注意:此技术与AngularJs的$ injector一起使用,并在annotate函数中实现.(见https://github.com/angular/angular.js/blob/master/src/auto/injector.js并在相应的单元测试https://github.com/angular/angular.js/blob/master /auto/injectorSpec.js)

  • 我想知道Angular是怎么做到的 - 非常聪明! (2认同)

won*_*ng2 12

假设你的函数名是 foo

是否有可能将Javascript函数的所有参数都写入接受?

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

如果没有,是否可以获得参数的数量?

foo.length 会工作

  • 我认为`.length`属性是你能做的最好的.毕竟,谁在乎什么参数的名称是什么? (2认同)