Visualizzazione dei risultati da 1 a 8 su 8

Discussione: arguments.calle

  1. #1

    arguments.calle

    ciao! sto cercando di capire l'oggetto arguments, ma sinceramente non ho idea di come poterlo usare. la guida di flash non offre particolari spiegazioni.
    l'esempio riportato è il seguente:
    factorial = function (x) {
    if (x <= 1) {
    return 1;
    } else {
    return x * arguments.callee (x-1);
    }
    };
    allora provo ad assegnare ad una variabile il risultato della funzione (passando come argomento il valore 4):

    result= factorial(4);
    trace(result);

    Perchè cavolo il risultato è 24???? :master:
    qualcuno sa darmi qualche indicazione su quest'oggetto o spiegarmi il ruolo di arguments.callee nella funzione d'esempio?

  2. #2
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Innanzitutto, 24 è il fattoriale di 4, cioè:

    1 x 2 x 3 x 4 = 24

    e, ad esempio, il fattoriale di 5 è 120, cioè:

    1 x 2 x 3 x 4 x 5 = 120;

    chiaro cos'è il fattoriale?
    Detto questo, arguments.callee, all'interno di una funzione, è un riferimento alla funzione a cui appartiene l'array arguments, cioè l'array degli argomenti passati alla funzione. Ovviamente, dentro la funzione "factorial", il riferimento alla funzione a cui appartiene l'elenco degli argomenti di "factorial" è appunto "factorial".
    A dire, arguments.callee è un riferimento alla funzione stessa.

    Quindi, senza dover specificare dentro la funzione il nome della funzione stessa:

    codice:
    factorial = function (x) { 
    	if (x <= 1) { 
    		return 1; 
    	} else { 
    		return x * factorial(x-1); 
    	} 
    };
    si usa arguments callee in modo che la funzione possa richiamare se stessa.

    codice:
    factorial = function (x) { 
    	if (x <= 1) { 
    		return 1; 
    	} else { 
    		return x * arguments.callee(x-1); 
    	} 
    };

  3. #3
    ok ma ancora non mi è chiaro perchè, nel richiamare la funzione (linea 5 dello script)l'argomento viene sottratto di uno.

  4. #4
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Perchè per calcolare il fattoriale di 4, deve moltiplicarlo per tutti i numeri che lo precedono fino all'uno, cioè:

    4 x 3 x 2 x 1 = 24;

    e quindi togliergli mano a mano una unità fino a fermarsi all'uno e restituire il totale..

  5. #5
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Cioè:

    4 x (4 - 1) x ((4 - 1) - 1) x (((4 - 1) - 1) - 1) = 24;

  6. #6
    OK!grazie per la spiegazione Negatyve!

  7. #7
    quindi si potrebbe trasformarlo ad esempio in un metodo dell'oggetto math
    math.prototype.factorial= function(x){
    if (x <= 1) {
    return 1;
    } else {
    return x * factorial(x-1);
    }
    };
    e richiamarlo poi tranquillamente nelle operazioni del filmato vero?

  8. #8
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Quasi. Math non è una classe, ma un oggetto statico, quindi non ha propriamente un oggetto prototype. Infatti, quando usi l'oggetto Math, non fai mai:

    codice:
    var miomath = new Math();
    var num_random = miomath.random();
    bensì direttamente

    codice:
    var num_random = Math.random();
    Per questa stessa ragione, i metodi aggiuntivi li scrivi direttamente nell'oggetto:

    codice:
    Math.factorial= function(x){ 
    	if (x <= 1) { 
    		return 1; 
    	} else { 
    		return x * arguments.callee(x-1); 
    	} 
    };
    usandoli poi così:

    codice:
    var fact_num = Math.factorial(4);

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 © 2025 vBulletin Solutions, Inc. All rights reserved.