Hola:
Por aportar algo al tema, un benchmark: No es muy eficiente declarar funciones dentro de funciones, ya que la interna siempre se re-declarará cuando llamemos a la externa.
He propuesto 3 modos:
MODO1: Llamada directa a una función que hace a*b.
MODO2: Llamada con creación de función interna auxiliar que multiplica, y llamada a esa función interna.
MODO3: Llamada que llama a función externa (a la función del MODO1).
Los resultados para multiplicar los primeros 100.000 números son (en IE6, en FF3 va mucho más rápido):
MODO1: 265 ms (1x).
MODO2: 1063 ms (4x).
MODO3: 468 ms (1,7x).
Conclusion: Aunque hay veces que es más útil declarar funciones internas para realizar ciertos aspectos iterativos, es cuatro veces más lento. Es más eficiente declararlas fuera de la función como variables globales para no re-definirlas en cada llamada.
El código:
Código PHP:
// prueba 1
function multiplicar(a,b) {
return a*b;
}
var ini = new Date().getTime();
for(var i=100000; i--; )
multiplicar(i,i+1);
document.write("He tardado en multiplicar() "+(new Date().getTime()-ini)+" ms.<br/>");
// prueba 2
function multiplicar2(a,b) {
function m(a,b) { return a*b; }
return m(a,b);
}
var ini = new Date().getTime();
for(var i=100000; i--; )
multiplicar2(i,i+1);
document.write("He tardado en multiplicar2() "+(new Date().getTime()-ini)+" ms.<br/>");
// prueba 3
function multiplicar3(a,b) {
return multiplicar(a,b);
}
var ini = new Date().getTime();
for(var i=100000; i--; )
multiplicar3(i,i+1);
document.write("He tardado en multiplicar3() "+(new Date().getTime()-ini)+" ms.<br/>");
Y me temo que lo mismo ocurre al crear "clases":
MODO1: Redefinir el método
alertaId() en cada creación de una instancia.
MODO2: this.alertaId sólo apunta a una función que es definida una sola vez.
Resultados para crear 100.000 instancias (en IE6, en FF3 va mucho más rápido):
MODO1: 1172 ms (1,6x).
MODO2: 734 ms (1x).
Código:
Código PHP:
// prueba 1
function _obj(id) {
this.id = id;
this.alertaId = function() {
alert( this.id );
}
}
var ini = new Date().getTime();
for(var i=100000; i--; )
new _obj(i);
document.write("He tardado en _obj() "+(new Date().getTime()-ini)+" ms.<br/>");
// prueba 2
var alertaElId = function() {
alert( this.id );
}
function _obj2(id) {
this.id = id;
this.alertaId = alertaElId;
}
var ini = new Date().getTime();
for(var i=100000; i--; )
new _obj2(i);
document.write("He tardado en _obj2() "+(new Date().getTime()-ini)+" ms.<br/>");
Así que siempre que se pueda: Siempre declarar las funciones como globales.
Un saludo