我最近了解到ES6功能允许使用解构对象定义函数参数。像这样
function makeGenerator({type, max}) {
//some code
return something
}
我真的很喜欢这种方法,因为它允许我查看函数所需的参数,无论是在哪里定义和,它都被调用。 (非常适合自我记录代码!)
我将它与默认参数一起使用,如:
function makeGenerator({type = "natural", max = 10})
这很棒!
但是...
有时我想,通常用于调试目的(但不限于)获取函数的所有参数的摘要。但是:
function makeGenerator({type = "natural", max = 10}) {
console.log(arguments[0])
}
makeGenerator({type = "fibanacchi"});
将输出:
{type: "fibanacchi"}
即使在函数内部我能够按预期使用变量max,其默认值为10,我真的希望得到所有函数参数的摘要,在它们与默认值合并之后
意思是,我想用上面的例子输出一些方法:
{type: "fibanacchi", max: 10}
没有分别在除函数定义之外的其他地方指定每个参数。
有办法吗?
答案 0 :(得分:2)
你可以获得stringed函数并使用正则表达式获取参数部分。
function getArguments(fn) {
var string = fn.toString(),
count = 0,
start = string.indexOf('('),
i = start;
while (i < string.length) {
if (string[i] === '(') {
count++;
} else if (string[i] === ')' && !--count) {
return string.slice(start + 1, i);
}
i++;
}
return '';
}
function makeGenerator({ type = "natural", max = 10 }) {
console.log(arguments[0])
}
function fn({ fo = 42, bar = (1 + (3)) * 4 }) { }
console.log(getArguments(makeGenerator));
console.log(getArguments(fn));
答案 1 :(得分:2)
没有办法让这里的参数为max,因为没有传递。您正在使用的功能按设计工作,因为仅显示传递的参数。
为了查看max的值,当你没有作为参数传递时,你需要明确地命名它。