在js中:如何获取包含函数所有参数的对象,包括默认参数?

时间:2018-01-03 19:45:05

标签: javascript

我最近了解到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}

没有分别在除函数定义之外的其他地方指定每个参数。

有办法吗?

2 个答案:

答案 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的值,当你没有作为参数传递时,你需要明确地命名它。