Os fechamentos de JavaScript são uma característica do desenvolvimento ativo e desenvolvimento passivo. Ou seja, por um lado, o JS tem fechamentos para resolver melhor alguns problemas. Por outro lado, para resolver certos problemas, o JS precisa usar o fechamento para resolver problemas mal.
O primeiro não é discutido aqui. Se o fechamento de JS puder resolver melhor o problema, é claro, o uso de fechamentos é melhor.
O que estou discutindo é o último por causa das limitações do próprio JS e do problema que precisa ser resolvido com o fechamento, como o requisito de "as variáveis são inicializadas apenas uma vez".
A linguagem convencional resolve isso:
A cópia do código é a seguinte:
classe de classe {
function init () {
this.n = 0;
}
função func () {
this.n ++;
devolver este.n;
}
}
var obj = nova classe ();
JavaScript é geralmente resolvido dessa maneira (usando fechamentos):
A cópia do código é a seguinte:
var obj = {
func: (function () {
var n = 0;
Return function () {
n ++;
retornar n;
}
}) ()
}
Mas eu recomendaria este método (eliminando o fechamento):
A cópia do código é a seguinte:
classe de função () {
var self = this;
self.n = 0;
self.func = function () {
self.n ++;
retornar self.n;
}
}
var obj = nova classe ();
Porque o último é mais escalável. Quando você precisa implementar operações diferentes em uma variável, este último pode definir uma função diferente (ou seja, expansão linear simples), enquanto o primeiro (fechamento) precisa ser completamente reescrito (é por isso que você costuma ouvir a palavra refatoração).