Teknikken bag funktionskædning, også kendt som currying, kan med stor fordel anvendes i JavaScript applikationer. Jeg ved godt at de fleste webudviklere render skrigende bort, og flamer en med etiketter som: Übergeek og akademiker-wannabe, når man nævner funktionel programmering, men hvis man piller lidt af den værste matematik-teori væk, og tager et par simple eksempler, så kan de fleste vist godt se fordelene.
Currying er den teknik man bruger, når man fylder de første parametre ud i en funktion, og returnerer en ny funktion.
var add = function(x, y){
return x + y;
}
var add5 = function(x){
return add(5, x);
}
Så burde de fleste jo nok genkende teknikken. Oliver Steelehar lavet en lille fix funktion, som gør currying, eller funktionssammenkædning meget lettere. Lad os sige vi f.eks vil lave en partiel funktion, der hooker op på click-events. Så kan vi deffinerer den således:
var hookupClick = document.body.addEventListener
.partial("click", undefined, false);
Og kalde den sådan:
hookupClick(function(){
alert("Hello!");
});
Det smarte her, er at man blot udfylder parametrene med undefined på de pladser, som den nye funktion skal udfylde. Funktionen er for så vidt rimelig simpel:
Function.prototype.partial = function(){
var fn = this, args = Array.prototype.slice.call(arguments);
return function(){
var arg = 0;
for ( var i = 0; i < args.length && arg < arguments.length; i++ )
if ( args[i] === undefined )
args[i] = arguments[arg++];
return fn.apply(this, args);
};
};
Den inplementeres som prototype på Function objektet.
I første linie initialiceres de private variabler, som kommer til at holde reference til henholdsvis den kaldende funktion (fn) og til de medfølgende argumenter (args). Det smarte her er at funktionen i sig selv returnerer en funktion, som selv har en potentiel argument array, men som samtidig får de oprindelige argumenter med via closure i den private variabel: args.
På kaldetidspunktet laves der et gennemløb af disse argumenter, og den kaldende funktions argumenter indsættes på de pladser hvor man har udfyldt med: undefined.
Til sidst afsluttes med et kald til den oprindelige funktion med den nye funktion som this parameter og den nye sammensatte argument array (args) som parameter arry.
Med den funktion, er det super let at lave sine funktionskæder, og husk at funktionen returnerer en funktion, så der er ikke overhead forbundet med at kalde den igen og igen.
Code on…