Uma característica de linguagens funcionais muito usada em Javascript é a técnica de Currying, a grosso modo de explicar, usada para transformar uma função com n argumentos em uma outra função com argumentos simples.
1 2 3 4 5 6 7 8 9 | function pow(i, j) { return i * j; } function square (k) { return pow(k, 2); } alert(square(6)); |
Veja nesse exemplo que uma função denominada de pow (que multiplica dois elementos) é usada na função square (que multiplica sempre um elemento por 2) de forma que você tem o uso de primeira pela segunda com uma redução de parâmetros. Essa técnica é usada nas funções de alta ordem como Fold, Map, etc.
1 2 3 4 5 6 7 8 | Array.prototype.each = function(fn){ for(var i = 0, len = this.length; i<len; ++i ) { fn.call(this,this[i]); } } var multiplicar = function(i) { alert(i * 2); } var teste = [1,2,3]; teste.each(multiplicar); |
Exemplo acima usando uma função que aplica outra função para cada elemento de um array.
Essa técnica ficou popular mesmo sendo usada junto a Closure que precisam de funções de callback para processar um resultado de outra função.
Explicando isso em código, teríamos Currying da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 | function atualizar(id) { return function(resposta) { document.getElementById(id).innerHTML = resposta; }; } function processar(msg, fn) { fn(msg); }; processar('testando currying em ação', atualizar('area')); |
Na linha 1, temos a declaração de uma função denominada atualizar que recebe um parâmetro em seu construtor que será o id de um elemento qualquer. A chamada a essa função provoca o retorno de uma outra função declarada internamente na linha 3. Essa função interna recebe também um argumento e a função dela é adicionar esse argumento no conteúdo do elemento passado como parâmetro na função inicial. Criei uma função chamada processar apenas para aplicar uma mensagem a um função, será usada para fazer a mágica do Currying aqui. Veja na linha 15 que usei a função processar para submeter uma frase (primeiro argumento) na função atualizar (segundo argumento), passando para ela o id de um elemento como um DIV.
Observe que esse código é muito comum em frameworks ajax, um exemplo claro disso seria como o DWR trabalha.
1 2 3 4 5 | function callback(retorno) { alert(retorno); } DWRInterface.metodo(callback); |
Aqui aplicamos a função callback na função “metodo” que é um método do objeto DWRInterface controlado pelo framework DWR. DEssa forma quando o DWR processar a requisição ajax, submete o retorno vindo do servidor para a função callback que o recebe como parâmetro.
Vamos investigar outras características de linguagens funcionais nos próximos artigos.
Posted in JavaScript, Programação funcional, Web Development ~ 6 Comments

