Desenvolvimento

10 set, 2009

Utilizando a propriedade callee do Javascript

Publicidade

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.