Devi pensare come viene eseguito il codice.
Tutto parte da
console.log(f(a-b,v[0],v)+a+b+v[0]+v[1]);
qui prima di tutto viene chiamata la funzione f(), con quali parametrri?
1) a-b, quindi 5-4=1
2) v[0] quindi il valore nella prima posizione dell'array v -> 4
3) tutto l'array v
dunque la chiamata è
f(1, 4, v)
i parametri risultano b=1, c=4, d=v
adesso si esegue il codice della funzione f()
a diventa a+5 = 10 (viene visto il parametro a definito all'inizio del codice
b diventa b+2 = 3
c diventa c+7 = 11
ora si chiama la funzione g() col parametro c=11
in g() succede che:
viene definita una nuova variabile a ed è inizializzata a 31, ma la a definita fuori resta 10!
d[1] viene incrementata di 3, quindi 5+3=8
v[0] viene incrementata di 2, quindi 4+2=6
la a locale passa a 31+11=42, quella fuori è ancora 10
qui c è trattata come variabile locale, perché è passata come parametro, poteva chiamarsi anche x, ma l'hanno chiamata c per confondere le idee, e diventa 11+3=14
non modifica però la variabile c usata in f() che resta 11
ad f() viene ritornato il valore b+c=3+14=17
f() ritorna g(c)+b+c+d[1]=17+3+11+8=39
la chiamata iniziale stampa
39+10+4+6+8=67
Il codice è decisamente incasinato e con nomi delle variabili poco chiari, il tutto con l'evidente intento di confonderti le idee e costringerti a ragionare.
Comunque, aggiungi stampe per vedere man mano quanto valgono le variabili, così ti rendi conto di ciò che accade, per esempio:
codice:var a=5, b=4, v=[4,5]; function f(b,c,d) { console.log("F1. a: "+a); console.log("F1. b: "+b); console.log("F1. c: "+c); function g(c) { console.log("G1 c: "+c); var a=31; d[1] += 3; v[0] += 2; a += 11; c += 3; console.log("G2 a: "+a); console.log("G2 d[1]: "+d[1]); console.log("G2 v[0]: "+v[0]); console.log("G2 c: "+c); return(b+c); } a += 5; b += 2; c += 7; console.log("F2 a: "+a); console.log("F2 b: "+b); console.log("F2 c: "+c); var gc = g(c); console.log("F3 gc: "+gc); console.log("F3 b: "+b); console.log("F3 c: "+c); console.log("F3 d[1]: "+d[1]); var somma = gc+b+c+d[1]; console.log("F3 somma: "+somma); return(gc+b+c+d[1]); } console.log("Main a: "+a); console.log("Main b: "+b); console.log("Main v[0]: "+v[0]); console.log("Main v[1]: "+v[1]); var f = f(a-b,v[0],v); var tot = f+a+b+v[0]+v[1]; console.log("Main f(): "+f); console.log("Main a: "+a); console.log("Main b: "+b); console.log("Main v[0]: "+v[0]); console.log("Main v[1]: "+v[1]); console.log("Main tot: "+tot);

Rispondi quotando