2014-04-24 17 views
9

Ho una funzione, message che richiede un parametro per definire il tipo di messaggio e quindi unisce altri argomenti per formare il messaggio, puramente un messaggio.Previa argomento agli argomenti quindi applica

Ecco come si presenta:

function message(type) { 
    var msg = _.rest(arguments).join(" "); 

    // Really the type will be used to set the class on a div 
    // But I'm just using console.log to keep it simple for now. 
    console.log(type + ": " + msg); 
} 

voglio fornire funzioni di supporto, error, warning, info, che semplicemente chiamano message con il tipo giusto. Non sono sicuro del modo migliore per farlo. Non riesco a pensare in due modi, ma non sono sicuro se sto andando su di esso correttamente o che forse sto complicando le cose.

Il primo modo sembra un po 'ridondante, creare un nuovo array contenente il primo arg e gli argomenti quindi appiattirlo.

message.apply(this, _.flatten(["error", arguments])); 

Il secondo modo si sente un po '... disordinato?

Array.prototype.unshift.call(arguments, "error"); 
message.apply(this, arguments); 

Anche se dal mio experiement:

(function() { 
    Array.prototype.unshift.call(arguments, 0); 
    console,log(arguments); 
})(1, 2, 3); 

ottengo il seguente output:

[0, 1, 2, 3, undefined, undefined, undefined, ..., undefined] 

risposta

5

In ES5 questo potrebbe essere un po 'più efficiente di converti ng per un array reale e poi unshift:

var args = Array.prototype.concat.apply(["error"], arguments); 
message.apply(this, args); 

EDIT: Meglio evitare l'appiattimento array in input:

var args = ["error"]; 
args.push.apply(args, arguments); 
message.apply(this, args); 
+1

Fate attenzione ad usare questo, come se gli elementi di 'arguments' fossero array che saranno" appiattiti "nell'array invece di essere aggiunti come elementi stessi. per esempio. 'var args = Array.prototype.concat.apply ([" errore "], [" mela "," banana ", [" carota "," ciliegia "]])' erroneamente diventa 'args = [" errore ", "mela", "banana", "carota", "ciliegia"] '. – samthecodingman

Problemi correlati