【问题标题】:Create variable of arguments type创建参数类型的变量
【发布时间】:2019-04-03 16:54:32
【问题描述】:

我正在尝试让中间件函数调用它调试,它应该接受一些参数,记录它们并传递给下一个函数:

const debug = (...args) => {
 console.log(...args)
 return args // will return array, not argument type variable
}

const compose = (...fns) => (...arg) => (
  fns.slice().reverse().reduce(
    (acc, fn) => !acc ? fn(...arg) : fn(acc), null
  )
)

const f = x => x * x

const g = (a, b) => a + b

const makeMagic = compose(
  f,
  g,
  debug
)

makeMagic(1, 2)

如果我从组合中删除调试,一切都会按预期工作,只要我把它放在最后,它就会中断。因为它接受参数但返回数组。

我试图用这种方式重写debug

function debug() {
  console.info(arguments)
  return arguments
}

但它绝不会失败。

【问题讨论】:

  • debug被多个参数调用时,return args应该返回什么?
  • 也许这个问题有助于获取数组:stackoverflow.com/q/54568053/1447675
  • @Mark Meyer 它应该返回相同数量的参数。

标签: javascript


【解决方案1】:

函数总是只有一个结果值。您不能编写一个接受多个参数并“返回”多个值的函数,而无需围绕它们的某种容器(如数组),它只是 JavaScript 不具备的功能(大多数其他编程语言也不具备)。

您可以将debug 设为单个 参数的纯传递,但不能用于多个参数。因此,例如,您可以完成这项工作:

const result = debug(makeMagic(1, 2))

...其中result 将是返回的值makeMagic(在debug 记录它之后),但您不能以您尝试的方式将它包含在组合的makeMagic 中。

要将debug(或任何其他函数)与compose 放在链的中间,您必须对其和所有composeable 函数使用有关它们如何返回多个值的约定,可能是让它们都返回一个数组。这也有助于现在的事实,你的 compose 函数有我认为是一个错误:它使用 ...args 任何时候之前的函数返回一个 falsy 值(0,@ 987654333@、NaNnullundefinedfalse),我很确定您打算只在第一次通话时这样做。

这是compose 的一个版本,它需要可组合的函数,即返回其结果数组的函数:

const debug = (...args) => {
    console.log(...args);
    return args;
};

const compose = (...fns) => (...args) => (
    fns.slice().reverse().reduce(
        (acc, fn) => fn(...(acc || args)),
        null
    )
);

const f = x => [x * x];

const g = (a, b) => [a + b];

const makeMagic = compose(
    f,
    g,
    debug
);

const result = makeMagic(1, 2);
console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2020-09-19
    • 2021-02-04
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多