2010-11-29 14 views
5

En términos de consumo de memoria, ¿son equivalentes o recibimos una nueva instancia de función para cada objeto en este último?Funciones anónimas y consumo de memoria

var f=function(){alert(this.animal);} 
var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=f; 
    items.push(item); 
} 

y

var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=function(){alert(this.animal);}; 
    items.push(item); 
} 

EDITAR

estoy pensando que para que el cierre funcione correctamente, la segunda instancia sería ciertamente crear una nueva función de cada pasada. ¿Es esto correcto?

Respuesta

5

Debe pefer el primer método, ya que el segundo crea una función cada vez que el intérprete pasa esa línea.

En cuanto a su edición: estamos en el mismo ámbito todo el tiempo, ya que JavaScript tiene alcance de función en lugar de ámbito de bloque, por lo que podría ser optimizable, pero no encontré una implementación que no lo crea cada hora. Recomendaría no confiar en esta optimización (probablemente posible), ya que las implementaciones que carecen de soporte podrían exceder los límites de memoria si usa esta técnica extensivamente (lo cual es malo, ya que no sabe qué implementación ejecutará, ¿no?).

1

No soy un experto, pero me parece que diferentes motores de JavaScript podrían manejar esto de diferentes maneras.

Por ejemplo, V8 tiene algo llamado clases ocultas, lo que podría afectar el consumo de memoria al acceder a la misma propiedad. Tal vez alguien pueda confirmar o negar esto.