如何多次调用此默认args函数?

时间:2018-08-08 11:39:00

标签: javascript algorithm performance ecmascript-6

我遇到了一个问题,我需要允许在JavaScript中的函数上设置默认参数:

function dfltArgs(func, params) {

  const strFn = func.toString()
  console.log(strFn)
  const args = /\(([^)]+)\)/.exec(strFn)[1].split(',')

  const defaultVal = (arg, val) => typeof arg !== 'undefined' ? arg : val

  return (...dynamicArgs) => {
    const withDefaults = args.map((arg, i) =>
      defaultVal(dynamicArgs[i], params[args[i]]))
    return func(...withDefaults)
  }

}

function add (a, b) { return a + b }
var add_ = dfltArgs(add,{b:9})
console.log(add_(10)) // Should be 19
var add_ = dfltArgs(add_,{b:3})
console.log(add_(10)) // Should now be 13

但是,我需要能够多次调用此函数并覆盖先前设置的默认值:

var add_ = defaults(add,{b:9})
add_(10) // Should be 19
var add_ = defaultArguments(add_,{b:3})
add_(10) // Should now be 13

这在我的实现中不起作用,因为第二个调用的字符串化函数是:(...dynamicArgs) => {,等等。

我该如何重构?可能需要以某种方式使用bind

1 个答案:

答案 0 :(得分:4)

为什么不使用一些带有实际默认参数的箭头函数,而不是复杂的默认args事情?

 var _add = (a, b = 8) => add(a, b);

这样,您可以轻松更改绑定的内容:

 var add_ = (a = 2, b) => _add(a, b);
 add_() // 10