Hola, estoy frente a otro interrogante:
Resulta que quiero hacer algo como ésto:
Código PHP:
function hazAlgo(miAlerta, fdespues) {
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(miAlerta, fdespues) {
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(miAlerta, fdespues) {
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 f = this;
var a = 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(miAlerta, fdespues) {
alert(miAlerta);
fdespues();
}
Function.prototype.toClosure = function() {
var f = this;
var a = 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(miAlerta, n, fdespues) {
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 f = this;
var a = arguments;
return function() {
f.apply(this,a);
}
}
var suma5y10 = suma.toClosure(5,10);
hazAlgo("No veo mi suma...", 3, suma5y10);
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