这种模式f(a)(b)(c)叫做什么?

时间:2014-11-14 08:29:51

标签: javascript function functional-programming

function setStyle(x) {
    with (x.style) {
        padding = '10px'
        marginBottom = '10px'
        width = '100%'
    }
    return setStyle
}

setStyle(account)(password)(login)

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

更新:

有人将此问题视为重复,但我不明白为什么会重复这个问题。其他问题是关于一些框架,海报试图理解代码。我不试图理解代码,我问的是一个已知模式的英文术语。即使讨论的概念是相同的,但问题是不同的。这就像是说“谁是雅克森五人中最年轻的”和“谁的专辑是惊悚片”都是同一个问题,只是因为它碰巧是同一个人。但那些是不同的问题,不一样。

1 个答案:

答案 0 :(得分:4)

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

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

你可以更简洁地重写这个

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

(练习:写chain())。

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

请注意,此模式本质上是反功能的,因为在函数式编程中,我们更喜欢使用纯函数,而" retursive"函数只能做任何有用的副作用。

UPD:这种推理适用于盲目返回的函数,例如,在您的示例中,f()()()语法也可以与每次调用时返回其他的函数一起使用。在这种情况下," root"函数接受用于携带状态的隐藏参数("累加器")。这种方法的一个很好的例子是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);




在这种情况下,这个语法用于实现"部分应用程序",因为我们返回一个闭包,它再次使用预定义的第二个参数调用root函数。