Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/08/2007, 10:17
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 4 meses
Puntos: 45
¿Cómo puedo ejecutar una función con argumentos si es pasada por argumento?

Hola, estoy frente a otro interrogante:

Resulta que quiero hacer algo como ésto:
Código PHP:
function hazAlgo(miAlertafdespues) {
    
alert(miAlerta);
    
fdespues();

Sirve para ejecutar algo en la función hazAlgo() y cuando termine ejecutar la función pasada por parámetro. Ejemplo:
Código PHP:
function hazAlgo(miAlertafdespues) {
    
alert(miAlerta);
    
fdespues();
}

function 
saluda() {
    
alert("hola");
}

hazAlgo("No oigo mi saludo."saluda); 
Eso está muy bien para funciones sin parámetros. De acuerdo. Ahora vamos a ponerle parámetros a saluda(): saluda(conQue):
Código PHP:
function hazAlgo(miAlertafdespues) {
    
alert(miAlerta);
    
fdespues();
}

function 
saluda(conQue) {
    
alert(conQue);

Está claro, llamemos ahora como llamemos a la función no hará lo que deseamos:
  • hazAlgo("No oigo mi saludo.", saluda ); -> salta un undefined porque conQue = undefined.
  • hazAlgo("No oigo mi saludo.", saluda("adios!") ); -> será todavía más desastroso, porque lo primero que ejecuta es saluda("adios!") y luego ejecuta hazAlgo("No oigo mi saludo.", undefined), y al intentar hacer undefined() ocurre un error.

Bueno, entramos en los closures, donde podemos "guardar" una función con sus argumentos:
Código PHP:
function suma(a,b) {
    
alert("La suma de "+a+" y "+b+" es "+(a+b)+".");
}
Function.
prototype.toClosure = function() {
    var 
this;
    var 
arguments;
    return function() {
        
f.apply(this,a);
    }
}

var 
suma5y10 suma.toClosure(5,10); 
Así suma5y10() nos hará lo mismo que suma(5,10), lo tenemos "guardado con argumentos" en esa variable.

Entonces sí funciona:
Código PHP:
function suma(a,b) {
    
alert("La suma de "+a+" y "+b+" es "+(a+b)+".");
}
function 
hazAlgo(miAlertafdespues) {
    
alert(miAlerta);
    
fdespues();
}

Function.
prototype.toClosure = function() {
    var 
this;
    var 
arguments;
    return function() {
        
f.apply(this,a);
    }
}

var 
suma5y10 suma.toClosure(5,10);
hazAlgo("No veo mi suma..."suma5y10); 
Bueno, ya me he enrollado mucho hasta aquí. La cuestión que tengo ahora es cómo hacer ésto con un setTimeout dentro de hazAlgo(), ya que cuando hago el setTimeout por primera vez, se pierde el contenido de suma5y10...
Código PHP:
function suma(a,b) {
    
alert("La suma de "+a+" y "+b+" es "+(a+b)+".");
}
function 
hazAlgo(miAlertanfdespues) {
    
alert("miAlerta es : "+miAlerta+" \n n es: "+n+" \n fdespues es: "+fdespues); 
    if(--
n>0) {
        
alert(miAlerta);
        
setTimeout("hazAlgo('"+miAlerta+"', "+n+", "+fdespues+")"1000);
    }
    else {
        
fdespues();
    }
}

Function.
prototype.toClosure = function() {
    var 
this;
    var 
arguments;
    return function() {
        
f.apply(this,a);
    }
}

var 
suma5y10 suma.toClosure(5,10);
hazAlgo("No veo mi suma..."3suma5y10); 

Siento la introducción , el tema es un poco "nuevo" para mí y no quería que nadie se perdiese.

¿Alguna idea para hacer ésto y que valga para cualquier función que no sea suma()?





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.