Foros del Web » Programando para Internet » Javascript »

Funcion dentro de una funcion

Estas en el tema de Funcion dentro de una funcion en el foro de Javascript en Foros del Web. Hola, foreros: Estoy haciendo un formulario el cual es validado. Si la validacion es correcta quiero que se ejecute otra funcion (la funcion que envia ...
  #1 (permalink)  
Antiguo 24/08/2008, 01:31
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años, 1 mes
Puntos: 19
Funcion dentro de una funcion

Hola, foreros:

Estoy haciendo un formulario el cual es validado. Si la validacion es correcta quiero que se ejecute otra funcion (la funcion que envia los datos).

¿Como puedo hacerlo?

f
Código HTML:
unction validar(url, ajax_div,nick) 
	{
		nick = document.getElementById(nick);
		if(nick.value.replace(/ /g, '') == '')
			{
				return false;
			}
                function enviar(ajax_div)
                        {
				return false;
			}
        }
  #2 (permalink)  
Antiguo 24/08/2008, 02:31
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 1 mes
Puntos: 1284
Respuesta: Funcion dentro de una funcion

Hola:

No hay problemas en declarar funciones dentro de funciones, pero debes hacerla al principio del bloque para cuando sea necesario su uso, que esté visible... eso sí solo se podrá usar dentro de la función que la tiene...

Código:
function externa(a, b)	{
	function interna(a)	{
		// aqui el proceso interno
		return a;
	}
	// aquí se puede usar interna...
	return interna(a * b);
}
Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 24/08/2008, 09:46
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Funcion dentro de una funcion

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=100000i--; )
    
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=100000i--; )
    
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=100000i--; )
    
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() {
        
alertthis.id );
    }
}
var 
ini = new Date().getTime();
for(var 
i=100000i--; )
    new 
_obj(i);
document.write("He tardado en _obj() "+(new Date().getTime()-ini)+" ms.<br/>");


// prueba 2
var alertaElId = function() {
    
alertthis.id );
}
function 
_obj2(id) {
    
this.id id;
    
this.alertaId alertaElId;
}
var 
ini = new Date().getTime();
for(var 
i=100000i--; )
    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
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 06/09/2008, 12:32
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años, 1 mes
Puntos: 19
Respuesta: Funcion dentro de una funcion

Hola de nuevo...

Siento decir que se me habia olvidado este post, jeje... iva a escribir uno igual hasta que recorde que ya lo habia escrito...

Bueno... muchas gracias por las respuestas me han valido un monton...

Hasta pronto...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:03.