È possibile accedere al valore di ritorno javascript al di fuori della funzione? [chiuso]

2
milkmachine = function(argument){
    var r=1, k=2;
    //.....
    return r;
}
milkmachine(); //returns r, good
milkmachine.set_return_to_another_variable('k');
milkmachine(); //this should return k
    
posta Kinnard Hockenhull 31.10.2013 - 20:24
fonte

1 risposta

6

La risposta breve, come ha commentato Greg Hewgill, è: no (per quanto ne so io). Ci sono alcuni modi scadenti per ottenere quel comportamento e alcuni modi consigliati:

Modo scadente n. 1:

Un modo è avere due versioni della funzione: una che restituisce r , l'altra che restituisce k . Questo non è raccomandato perché duplica lo stesso codice, restituendo qualcosa di diverso.

Modo scadente n. 2:

Un'altra opzione sarebbe quella di aggiungere un altro parametro alla funzione che specifichi la variabile che si vuole restituire:

milkmachine = function(argument, retWhat){
    var r;
    var k;

    //do something with arguments and variables

    if (retWhat == "k")
        return k;
    else
        return r;
}

Anche questo non va bene dato che stai usando una funzione per fare più cose e una funzione dovrebbe fare solo una cosa ; inoltre, fornisce al codice esterno maggiori informazioni sul funzionamento interno della funzione rispetto a ciò che è buono. (Ci sono probabilmente altri, migliori ragioni per cui questo è male, ma al momento non riesco a pensare a niente.)

Modo consigliato n. 1:

Invece di restituire un solo valore, è possibile restituire entrambi i valori racchiusi in un oggetto contenitore:

milkmachine = function(argument){
    var r;
    var k;

    //do something with arguments and variables

    return new MilkMachineRetrunValue(r, k);
}

var retval = milkmachine("some arg");
// access retval.r here
// access retval.k here

// or you could directly access the variable
// that you wanted within the return wrapper
// after the call like so:
// milkmachine("some arg").k

Modo consigliato n. 2

Usa un oggetto:

function MilkMachine() {
    this.r;
    this.k;
}

MilkMachine.prototype.run = function(argument) {

    //do something with arguments and variables
}

var mm = new MilkMachine();
mm.run("some arg");
// access mm.r here
// access mm.k here
    
risposta data 31.10.2013 - 21:07
fonte

Leggi altre domande sui tag