【问题标题】:What is this pattern f(a)(b)(c) called?这种模式 f(a)(b)(c) 叫什么?
【发布时间】:2014-11-14 08:29:51
【问题描述】:
function setStyle(x) {
    with (x.style) {
        padding = '10px'
        marginBottom = '10px'
        width = '100%'
    }
    return setStyle
}

setStyle(account)(password)(login)

我经常使用上面的模式,但是当我需要谈论它时,我不知道它叫什么?如何在谈话中提及这种做法?

更新:

有人将此问题关闭为重复,但我不明白为什么这是重复的。其他问题是关于一些框架的,发帖人试图理解代码。我不试图理解代码,我在询问已知模式的英文术语。尽管讨论的概念是相同的,但问题是不同的。就好像说“谁是贾克森五人组中最年轻的”和“谁的专辑是Thriller”都是同一个问题,只是因为恰好是同一个人。但这些是不同的问题,并不相同。

【问题讨论】:

  • 我会说“流利的接口”和“调用链”,但通常是使用返回“this”的方法,因此您可以继续在同一个对象上调用其他方法。在您的情况下,您返回该函数,以便您可以使用不同的参数重复调用它。相同的想法,但有点不同(我从未见过)。
  • with?我们称这种风格为“坏”。只是好奇:为什么你更喜欢使用它而不是传递多个变量或参数数组?
  • 你问的是“currying”吗?
  • @elclanrs:不,这不是柯里化。返回的函数不是柯里化函数,它只是同一个函数。

标签: javascript function functional-programming


【解决方案1】:

这种模式不是“函数链接”,因为链接(=组合,流水线)函数通过将一个函数的结果作为参数传递给下一个函数来工作。例如,如果你有类似的东西:

str = removeBadChars(str)
str = makeLowerCase(str)
str = convertToURL(str)

你可以更简洁地改写为

str = chain(removeBadChars, makeLowerCase, convertToURL)(str)

(练习:写chain())。

您的模式似乎没有名称,可能是因为它相当无用。 Crockford 先生coined 术语retursion, 但它似乎没有被广泛使用。

请注意,这种模式本质上是反函数式的,因为在函数式编程中我们更喜欢使用纯函数,而“递归”函数只能做任何有用的副作用。

UPD:这种推理适用于只是盲目地返回自身的函数,就像在你的示例中一样,但是,f()()() 语法也可以用于在每次调用时返回 something else 的函数。在这种情况下,“根”函数接受一个隐藏参数(“累加器”),用于携带状态。这种方法的一个很好的例子是chain(),就像上面一样,但写成应用风格:chain(func1)(func2)(func3)

function chain(f, fun) {

    fun = fun || function(x) { return x };

    if(typeof f != "function")
        return fun(f);

    return function(x) {
        return chain(x, function(y) { return f(fun(y)) })
    }
}

// Example:

makeLowerCase  = function(str) { return str.toLowerCase() };
removeBadChars = function(str) { return str.replace(/\W/g, "") };
makeURL        = function(str) { return "http://" + str };

funcs = chain(makeLowerCase)(removeBadChars)(makeURL);
x = funcs('!!! HELLO ???');
alert(x);

在这种情况下,此语法用于实现“部分应用程序”,因为我们返回一个闭包,该闭包再次调用根函数,并带有预定义的第二个参数。

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2016-09-13
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多