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 significa que todas las variables en una 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 poco común de código:
for(var i = 0; i < 100; i++) {
(function(j) {
setTimeout(function() { console.log(j); }, 1000);
})(i);
}
Ésta es una situación en la que una función anónima es un poco más derrochador de una función llamada porque estás recreando una función idéntica 100 veces durante el bucle cuando se podría simplemente reutilizar uno nombrado.
function setConsole(j) {
setTimeout(function() { console.log(j); }, 1000);
}
for(var i = 0; i < 100; i++) {
setConsole(i);
}
Esto tiene exactamente la misma cabeza de cierre, pero es más eficiente, ya que sólo has construido una función para crear cada nueva variable de entorno.
http://jsperf.com/immediate-vs-named(Gracias a @Felix Kling para el jsPerf.)
Por lo tanto, 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.
EDIT:Here's an article from Google. Específicamente, vea Evitando 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.
Excelente pregunta. He agotado mis votos por el día. ¿Alguien más puede hacer +1 por mí? –
@Michael ya lo hizo. Gran pregunta –
Ha habido una pregunta similar en SO sobre la * implementación * de cierres, pero todavía tengo que ver una con una respuesta satisfactoria. Es decir, ¿los motores de JavaScript * modernos * son lo suficientemente inteligentes para mantenerse alrededor de los objetos en el [[alcance]] a los que * se puede acceder *? Obviamente, esta optimización no es práctica para aplicar en presencia de 'eval', etc ... –