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);