< Nota>
il codice effettivo da quello linked answer è:
var args = Array.prototype.slice.call(arguments, 1);
cioè "slice", non "splice"
</Note>
Innanzitutto, il metodo slice
viene spesso utilizzato per make a copy of the array it's called on:
var a = ['a', 'b', 'c'];
var b = a.slice(); // b is now a copy of a
var c = a.slice(1); // c is now ['b', 'c']
Quindi la risposta breve è che il codice è fondamentalmente emulando:
arguments.slice(1); // discard 1st argument, gimme the rest
Tuttavia non è possibile farlo direttamente. special arguments
object (disponibile all'interno del contesto di esecuzione di tutte le funzioni JavaScript), sebbene l'Array- come in quanto supporta l'indicizzazione tramite l'operatore []
con tasti numerici, non sia in realtà una matrice; Non è possibile .push
su di esso, .pop
fuori di esso, o .slice
esso, ecc
Il modo in cui il codice esegue questo è di "ingannando" la funzione slice
(che a sua volta non è disponibile nell'oggetto arguments
) per eseguire nel contesto diarguments
, via Function.prototype.call
:
Array.prototype.slice // get a reference to the slice method
// available on all Arrays, then...
.call( // call it, ...
arguments, // making "this" point to arguments inside slice, and...
1 // pass 1 to slice as the first argument
)
Array.prototype.slice.call(arguments).splice(1)
compie la stessa cosa, ma effettua una chiamata estraneo alla splice(1)
, che rimuove elementi dal array restituito da Array.prototype.slice.call(arguments)
a partire dall'indice 1
e proseguendo fino alla fine dell'array. splice(1)
non funziona in IE (tecnicamente manca un secondo parametro che indica quanti elementi rimuovere che IE ed ECMAScript richiedono).
Ci scusiamo per la differenza di codice, ma ho copiato il codice che avevo qui incollato http://stackoverflow.com/questions/373157/how- can-i-pass-a-reference-to-a-function-with-parameters dalla risposta a cui ho fatto riferimento in questa domanda, ma l'autore ha cambiato lo script nel frattempo. Ancora una volta, mi dispiace per quello –
@Andreas: controlla mah updatez –
Ottima risposta! +1 –