Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Spiegazione di alcune righe di codice

    Buongiorno a tutti, sto imparando js per motivi di studio universitario e mi trovo un pò in difficoltà.
    Chi mi spiega cosa fa questo codice, l'ho eseguito in console e so che il risultato è 67, ma non ho capito bene perchè. Grazie a chi vorrà darmi una piccola dritta.

    codice:
    var a=5, b=4, v=[4,5];
    
    function f(b,c,d) {
    
    
      function g(c) {
        var a=31;
        d[1] += 3;
        v[0] += 2;
        a += 11;
        c += 3;
        return(b+c);
      }
      a += 5;
      b += 2;
      c += 7;
      return(g(c)+b+c+d[1]);
    }
    
    
    console.log(f(a-b,v[0],v)+a+b+v[0]+v[1]);

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    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);

  3. #3
    Tante grazie Alhazred, mi è tutto più chiaro con la tua spiegazione. In effetti credo sia come dici, il codice è volutamente incasinato, solo che essendo io poco esperto mi sono perso nella sua lettura. Grazie anche per il metodo di scomposizione suggerito.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.