function setStyle(x) {
with (x.style) {
padding = '10px'
marginBottom = '10px'
width = '100%'
}
return setStyle
}
setStyle(account)(password)(login)
我经常使用上面的模式,但是当我需要谈论它时,我不知道它叫什么?如何在对话中参考这种方法?
更新:
有人将此问题视为重复,但我不明白为什么会重复这个问题。其他问题是关于一些框架,海报试图理解代码。我不试图理解代码,我问的是一个已知模式的英文术语。即使讨论的概念是相同的,但问题是不同的。这就像是说“谁是雅克森五人中最年轻的”和“谁的专辑是惊悚片”都是同一个问题,只是因为它碰巧是同一个人。但那些是不同的问题,不一样。
答案 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函数。