Hoje vou mostrar uma propriedade interessante do Javascript, chamada callee, que tem uma finalidade bastante útil quando trabalhamos com funções anônimas.
A propriedade callee, que está contida na propriedade arguments, pode ser chamada de dentro de qualquer função, pois ela é herdada do objeto Global. Para chamar a ela mesma novamente, ou seja, ela é útil quando precisamos utilizar recursividade, mas com a vantagem de não se precisar conhecer previamente o nome da função, com isso podemos nos beneficiar do uso de funções anônimas.
Como exemplo, vou mostrar uma função que retorna a soma de todos os números de 1 a 2000, onde 2000 será o parâmetro passado à função para uma função que chama uma função onde o seu retorno é uma recorrência recursiva, que obedece à regra de que um determinado valor X tem como resultado de soma de todos os valores de um a X, o valor da soma de X com X-1 com X-2 .. 1. E, sabendo-se disso, podemos ver que para o resultado de X-1 acontece o mesmo; logo, podemos encurtar isso em uma recursão do tipo: resultado = se x>1 x+soma(x-1) senão, 1.
Assim, segue um código xhtml com esse exemplo sendo executado:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function retornaSoma() {
//essa função poderia fazer outras coisas além de retornar o valor
alert('Ola mundo! \nFiquem tranquilos, essa mensagem não aparecera denovo...');
return function(x) {
if (x <= 1)
return 1;
return x + arguments.callee(x - 1);
};
}
function exemploFuncaoCallee(x){
alert( "A soma de de todos os números de 1 a 2000 é "+ retornaSoma()(x) );
}
</script>
</head>
<body>
<input type="button" value="Pressione para chamar a função" onclick="exemploFuncaoCallee(2000)" />
</body>
</html>
Basta ver que arguments.callee é chamada passando um parâmetro novamente para ela, que avalia o seu valor até chegar em 1 onde chega em seu parâmetro de parada. Essa função é muito útil para quando queremos criar uma função bem específica, que só é necessária nesse escopo e nunca mais, como no caso acima. Claro que esse exemplo é bem simples, até mesmo porque para se saber a soma de todos os valores de determinada faixa de valores poderíamos utilizar apenas a fórmula return (X1+X2)*((X2-X1 +1) / 2 ). Onde x2 é o limite superior e x1 é o limite inferior. Nesse caso a recursão está apenas servindo como um exemplo simples, apenas para esclarecer.