Los cierres de JavaScript son una característica del desarrollo activo y el desarrollo pasivo. Es decir, por un lado, JS tiene cierres para resolver mejor algunos problemas. Por otro lado, para resolver ciertos problemas, JS tiene que usar cierres para resolver problemas apenas.
El primero no se discute aquí. Si los cierres de JS pueden resolver mejor el problema, por supuesto, usar cierres es mejor.
Lo que estoy discutiendo es lo último debido a las limitaciones de JS en sí, y el problema que debe resolverse con cierres, como el requisito de "las variables solo se inicializan una vez".
El idioma convencional resuelve esto:
La copia del código es la siguiente:
clase clase {
función init () {
this.n = 0;
}
función func () {
this.n ++;
devolver esto.n;
}
}
var obj = new class ();
JavaScript generalmente se resuelve de esta manera (usando cierres):
La copia del código es la siguiente:
var obj = {
func: (function () {
var n = 0;
Función de retorno () {
n ++;
regresar n;
}
}) ()
}
Pero recomendaría este método (eliminando los cierres):
La copia del código es la siguiente:
clase class () {
var self = this;
self.n = 0;
self.func = function () {
self.n ++;
devolver yo mismo.n;
}
}
var obj = new class ();
Porque este último es más escalable. Cuando necesita implementar operaciones diferentes en una variable, esta última puede definir una función diferente (es decir, expansión lineal simple), mientras que el primero (cierre) debe reescribirse por completo (es por eso que a menudo escucha la palabra refactorización).