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
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
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
Leggi altre domande sui tag javascript