entre - funciones lambda javascript
¿Hay algún inconveniente en el uso de funciones anónimas en JavaScript? Por ejemplo, uso de memoria? (3)
En algún momento del pasado, leí algo que me dio la idea de que las funciones anónimas en JavaScript pueden consumir una cantidad sorprendente de memoria (porque llevan todo el alcance actual con ellas), mientras que las funciones nombradas (¿estáticas?) No funcionan. Tengo este problema.
No recuerdo dónde lo leí, así que no puedo volver atrás, volver a leerlo y descubrirlo por mí mismo.
Tengo dos preguntas:
- ¿Hay situaciones en las que las funciones anónimas pueden usar suficiente memoria para que valga la pena preocuparse? (Si es así, ¿tiene un ejemplo?)
- ¿Hay otros inconvenientes para las funciones anónimas (en oposición a las funciones nombradas / estáticas)?
Creo que lo que probablemente leyó fue el problema de fuga de memoria de cierre de IE.
Mira este artículo sobre el tema.
Básicamente, en versiones anteriores de IE, el recolector de basura no podía manejar referencias circulares que involucraban objetos DOM. Dado que los cierres son muy propicios para tales referencias circulares, podrían conducir fácilmente a pérdidas de memoria molestas en IE.
Esto es cierto, debido a los cierres que se crean. como regla general, el mayor problema con la práctica son las preocupaciones de rendimiento con IE (especialmente las versiones anteriores de IE), que tiene un historial terrible de tratar con estos adecuadamente.
Todas las funciones de JavaScript se comportarán de la misma manera, ya que heredan los entornos de variables en toda la cadena de alcance que los lleva hasta ellos mismos. Esto es igualmente cierto para las funciones anónimas y nombradas.
Esta cadena de referencias a los entornos externos permanece con cada función, incluso si la función se pasa a un alcance completamente diferente.
Tradicionalmente, esto significaría que todas las variables en cualquier cadena dada tienen una referencia retenida mientras el cierre interno continúe existiendo. Aunque en los navegadores modernos que compilan el código, es probable que exista un análisis de las variables a las que realmente se hace referencia, y solo se retendrán, lo que permite que otras que ya no se mencionan sean basura.
Sin embargo, hay otras situaciones en las que una función anónima es un desperdicio.
Aquí hay un código de código común:
for( var i = 0; i < 100; i++ ) {
(function( j ) {
setTimeout( function() { console.log( j ); }, 1000 );
})( i );
}
Esta es una situación en la que una función anónima es un poco más derrochadora que una función nombrada porque estás recreando una función idéntica 100 veces durante el ciclo cuando podrías simplemente reutilizar una función con nombre.
function setConsole( j ) {
setTimeout( function() { console.log( j ); }, 1000 );
}
for( var i = 0; i < 100; i++ ) {
setConsole( i );
}
Esto tiene la misma sobrecarga de cierre, pero es más eficiente porque solo has construido una función para crear cada nuevo entorno variable.
http://jsperf.com/immediate-vs-named (Gracias a @Felix Kling para jsPerf).
Entonces, con respecto al cierre en particular, sí, hay gastos generales siempre y cuando mantenga el cierre mediante alguna referencia permanente. Diría que es bueno evitar esto si es posible pero no ser obsesivo al respecto. A veces, un nuevo entorno variable agregado a la cadena de alcance es simplemente la mejor solución.
EDITAR: Aquí hay un artículo de Google . Específicamente, vea Evitar peligros con cierres . para obtener información sobre el impacto en el rendimiento de la extensión de la cadena de alcance y para un reclamo de que las funciones anónimas son "más lentas" que las funciones nombradas.