No seu blog pessoal, Peter Michaux definiu um padrão de desenvolvimento chamado de “Lazy Function” que ele vem utilizando em funções que são eficientes no momento da execução do programa.
Imaginemos que queremos uma função xpto que nos devolva um objeto de tipo data com a hora em que xpto foi chamada por primeira vez no programa.
Poderíamos criar uma variavel global que seja inicializada a primeira vez que chamamos a função e as seguintes vezes somente devolver o valor dela:
var x;
function xpto() {
if (x) {
return x;
}
x = new Date();
return x;
}
mas o problema é que nada nos garante que entre uma e outra chamada, o valor de x não tinha sido alterado e ademais, para cada chamada da função, teríamos que verificar x.
Depois de analisar duas outras soluções, Peter mostrou a seguinte função:
var xpto = function() {
var x = new Date();
xpto = function() {
return x;
};
return xpto();
};
que funciona uma maravilha!
A primeira vez que chamamos a função, ela vai pegar a hora atual e seguidamente se redefinir como uma função que devolve aquela hora.
No artigo, Paul menciona que aquela técnica funciona muito bem quando queremos obter o primeiro estado de algum elemento, como o offset da barra de rolagem quando a pagina carrega.
2 respostas ate agora ↓
1 Sérgio // Oct 26, 2007 at 6:43 pm
E o que garante que o valor de xpto nao mudou entre uma chamada e outra???
Nessa solucao vc so muda a variavel global de x para xpto. xpto é uma variavel global como outra qualquer
2 Diego Carrion // Dec 16, 2007 at 1:29 pm
xpto não tem um valor Sérgio, xpto é uma função que te devolve a data da primeira chamada dela.
Efetivamente xpto também e uma variável global, uma variável que representa uma função. Para mudar o valor que ela devolve, você teria que redefinir a função, não seria possível fazer algo do tipo:
xpto = new Date();
Deixar um comentário