javascript - 创建参数类型的变量

标签 javascript

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

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
}

但绝不会失败。

最佳答案

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

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

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

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

要在 compose 链的中间使用 debug(或任何其他函数),您必须对它和所有 使用约定>compose关于它们如何返回多个值的函数,可能是通过让它们都返回一个数组。这也有助于说明现在的事实,你的 compose 函数有一个我认为是错误的东西:它使用 ...args 任何时候前一个函数返回一个 falsy 值 (0, "", NaN, null, undefined,或 false),我很确定您只打算在第一次调用时这样做。

这是 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);

关于javascript - 创建参数类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500420/

相关文章:

javascript - 试图找到 clientWidth 时,绝对位置搞砸了一切

javascript - React 试图循环遍历状态对象

javascript - mongoose - 如何在 getter 中获取对象而不是对象引用?

javascript - React JS Router 改变元素的 props

javascript - 如何将html5 Canvas 保存到服务器

javascript - 拉斐尔秩序对象

javascript - 如何为具有不同音频源的多个点击图像添加播放/暂停切换

javascript - 使用 moo 工具的 Fx.Slide 操纵许多滑动对象的最佳方式

javascript - 如何在同一个 react 应用程序中将 redux 和 graphql 与 apollo 客户端一起使用?

javascript - 如何在 angular-leaflet-directive 中旋转 map 标记?