How to call this default args function more than o

2020-01-19 04:12发布

I have encountered a question where I need to allow default args to be set on a function in 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

However, I need to be able to call this function more than once and overwrite previously set defaults:

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

This does not work in my implementation, because the stringified function on the second call is: (...dynamicArgs) => {, etc.

How can I refactor this? Probably need to use bind somehow?

1条回答
神经病院院长
2楼-- · 2020-01-19 04:56

Instead of your complicated default args thing, why not just use some arrow functions with real default arguments:

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

That way you can easily change the bound things:

 var add_ = (a = 2, b) => _add(a, b);
 add_() // 10
查看更多
登录 后发表回答