Newsgroup: it.comp.lang.javascript
Titolo: Passare funzioni dentro funzioni

ciao ragazzi, il mio quesito è:
io lancio una funzione che mi elabora dei dati, mettiamo ad esempio un
semplice controllo sui campi input e, a seconda di questi dati, deve
eseguirmi la funzione prova_a(); oppure la funzione prova_b().
il che si risolverebbe così:
function prova(field){
 var fieldValue = document.getElementById('field').value;
 if(value < 10){
  prova_a();
 }else{
  prova_b();
 }
}
però, visto che uso spesso questo tipo di funzione, avrei bisogno di
poter passare i nomi delle 2 funzioni secondarie come argomenti..
cioè:
function prova(field, funcA, funcB){
 var fieldValue = document.getElementById('field').value;
 if(value < 10){
//mi esegui la funzione che ha come nome funcA
 }else{
//mi esegui la funzione che ha come nome funcB
 }
}
qual'è la sintassi corretta?

 qual'č la sintassi corretta?
Ad esempio:
	function minore(){
		alert("il valore č minore di dieci");
	}
	function maggioreUguale(){
		alert("il valore č maggiore o uguale a dieci");
	}
	function prova(field, funcA, funcB){	
		var fieldValue = +document.getElementById(field).value;
 
		if ( fieldValue < 10 ){
			funcA();	
		}else{
			funcB();
		}
	}
	prova("miocampo", minore, maggioreUguale );
-- 
~ "Io ho fatto questo, dice la mia memoria
Io non posso aver fatto questo, dice il mio orgoglio.
Alla fine, č la memoria ad arrendersi." (Nietzsche)

 Alla fine, è la memoria ad arrendersi." (Nietzsche)
giuro che ci avevo provato anche io e non andava.. bho, magari
sbagliavo una virgola nella sintassi..
cmq grazie!

ehm.. e nel caso dovessi passare dei valori?
        function minore(x){
                alert("il valore è minore di dieci: "+x);
        }
        function maggioreUguale(x){
                alert("il valore è maggiore o uguale a dieci: "+x);
        }
così funizonerebbe:
	function prova(field, funcA, funcB, x){
		var fieldValue = +document.getElementById(field).value;
		if ( fieldValue < 10 ){
			funcA(x);
		}else{
			funcB(x);
		}
	}
ma mi farebbe comodo poter dichiarare le variabili aggiuntive nella
chiamata, tipo
	function prova(field, funcA('valore'), funcB('valore2'), ){
		var fieldValue = +document.getElementById(field).value;
		if ( fieldValue < 10 ){
			funcA('valore');
		}else{
			funcB('valore2')
		}
	}
..ma che ovviamente non funziona..

 ..ma che ovviamente non funziona..
Già, è proprio sbagliata sia la logica che la sintassi.
-- 
~ Se il destino è contro di noi, peggio per lui!

ZER0 ha scritto:
Mi aggancio qua perchè ho un problema molto simile.
Io in realtà sono già allo step successivo, perchè riesco a passare pure 
il parametro, ma prima di spiegare il problema un po' di codice:
function creaFrame(url,id,func)
{
       conteggioScript++;
       var iFrame=document.createElement('iframe');
       var body= document.getElementsByTagName('body')[0];
       var tabellaPrima= document.getElementsByTagName('TABLE')[1];
       iFrame.setAttribute('src',url);
       iFrame.setAttribute('style','width:0px; height:0px; border: 0px');
       iFrame.setAttribute('id',id);
       iFrame.setAttribute('onload',func);
       body.appendChild(iFrame);
}
questa funzione mi crea un frame nascosto nella pagina con l'url passato 
come parametro, e una volta che il frame è caricato esegue la funzione 
passata anch'essa come parametro. Tipica chiamata che faccio è
creaFrame(arrAdd[x],id,('analizzaSistema(id)'));
si crea quindi un frame con l'id che decido io, in modo da poterlo 
richiamare dalla funzione (a cui passo lo stesso id come parametro).
E questo funziona che è una meraviglia.
Solo che adesso avrei l'esigenza di posticipare l'esecuzione della 
funzione dell'onload, e quindi volevo scrivere qualcosa del tipo
iFrame.setAttribute('onload',setTimeout(func,1000));
solo che così non mi riconosce più il parametro id contenuto nel 
riferimento di func...
come ne vengo fuori?

 come ne vengo fuori?
Ah, aggiungo che ho provato a mettere
iFrame.setAttribute('onload',function(){setTimeout(func,1000);});
ma in questo modo non mi risolve piů la funzione...

 come ne vengo fuori?
Innanzitutto, va visto a cosa effettivamente ti serve.
E se è davvero quella la soluzione migliore, te ne esci usando sempre
lo stesso approccio indicato nell'altro mio post: Ovvero currying con
closure.
In verità, il setTimeout ammette anche un terzo parametro, ovvero gli
argomenti da passare alla funzione. Che è quello che servirebbe a te.
Peccato che IE non supporti tale specifica (Firefox e Opera si, forse
anche Safari). Se non contempli il supporto a IE, nessun problema. Ma
se invece non è così, devi usare il metodo di cui sopra... Almeno nel
caso di IE.
Negli archivi di questo NG dovresti trovare un mio vecchio post, dove
spiegavo tramite una sorta di currying con closure come rendere anche
il setTimeout come quello degli altri browser.
-- 
~ "When you have eliminated the impossible, whatever remains, however
improbable, must be the truth." (S.H.)

 
Andrò a spulciarmeli con molto interesse!!
Grazie mille
Marco

 Grazie mille
De nada, fammi sapere.
-- 
~ "Il successo è l'abilità di passare da un fallimento all'altro senza
perdere l'entusiasmo."
(W. Churchill)

ZER0 ha scritto:
<cut>
mamma mia, quanta carne al fuoco, grazie mille!!
Adesso provo a guardare con calma e poi ti (vi) faccio sapere!
Marco

 dovevi cambiare l'assegnazione dell'event-handler.
ok :)

ZER0 ha scritto:
<cut>
Riassumo quanto ho fatto.
Ho corretto quanto si diceva, trasformando i setAttribute e gestendo in 
maniera diversa l'eventHandling. Funziona tutto, compreso la gestione 
dell'id senza passare l'id come parametro.
Funziona finchè non metto in mezzo il setTimeout. Appena provo a 
introdurlo smette tutto di funzionare, quindi o mi dite come fare a 
farlo funzionare o una soluzione alternativa che ritardi l'esecuzione 
della funzione associata ad onload senza usare setTimeout :)
Marco

 della funzione associata ad onload senza usare setTimeout :)
Non è chiaro il perché tu voglia ritardare l'esecuzione di tale
funzione. Hai detto che hai diversi iframe creati dinamicamente
che a loro volta ne creano altri, e fin qui ci siamo.
Ma perché devi usare un setTimeout di un secondo? Come mai devi
ritardarne l'esecuzione proprio di un secondo? Qual'è il motivo
effettivo, ovvero i problemi derivanti dal NON usare il timeout
nel tuo codice?
Finché non è chiaro questo punto, è difficile proporti approcci
alternativi.
-- 
"Se c'è qualcosa di più importante del mio ego su questa nave,
la voglio catturata e fucilata."

 
In realtà il timeout non sarebbe di 1 secondo ma variabile (casualmente).
Il punto è che, come ti spiegavo, la creazione degli iframe avverrebbe a 
cascata, a più livelli.
Al primo livello vengono creati n1 frame che a loro volta creano 
ulteriori frame che a loro volta...
Questo processo bombarda di richieste il server ovviamente, e il server 
non è mio :) quindi volevo evitare che il proprietario si lamentasse del 
gran numero praticamente simultaneo di accessi da parte mia, quindi alla 
crazione di ogni frame avevo pensato di generare un numero casuale che 
mi desse il tempo di attesa prima di eseguire la funzione nell'onload 
(funzione che va a richiamare come i diceva ulteriori frames).
E' più chiaro adesso?
Marco