Этот шаблон является не «функциональная цепочка», поскольку функции с цепочкой (= скомпонованные, конвейерные) работают, передавая результат одной функции в качестве аргумента в следующую. Например, если у вас есть что-то вроде:
str = removeBadChars(str)
str = makeLowerCase(str)
str = convertToURL(str)
вы можете переписать это более сжато, как
str = chain(removeBadChars, makeLowerCase, convertToURL)(str)
(упражнение: написать chain()
).
У вашего шаблона нет названия, возможно, потому что оно довольно бесполезно. Г-н Крокфорд coined термин retursion, , но он, кажется, не используется широко.
Обратите внимание, что этот шаблон по сути является антифункциональным, потому что в функциональном программировании мы предпочитаем работать с чистыми функциями, в то время как «рекурсивная» функция может делать только что-либо полезное в качестве побочного эффекта.
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, с предопределенным вторым аргументом.
Я бы сказал «свободный интерфейс» и «цепочка вызовов», но обычно это методы, которые возвращают «это», поэтому вы можете продолжать использовать другие методы на одном и том же объекте. В вашем случае вы возвращаете функцию так, чтобы ее можно было повторно вызвать с помощью разных аргументов. Такая же идея, но немного другая (я ее никогда не видел). – Thilo
'с'? Назовем этот стиль _ "bad" _. И просто любопытно: почему вы предпочитаете использовать это для передачи нескольких переменных или массива параметров? – Cerbrus
Вы спрашиваете о «каррировании»? – elclanrs