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)
won*_*ng2 12
假设你的函数名是 foo
是否有可能将Javascript函数的所有参数都写入接受?
arguments[0] 至 arguments[foo.length-1]
如果没有,是否可以获得参数的数量?
foo.length 会工作