< Nota>
el código real de que linked answer es:
var args = Array.prototype.slice.call(arguments, 1);
es decir "corte", no "empalme"
</Nota>
En primer lugar, el método slice
se utiliza a menudo para 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']
Así que la respuesta corta es que el código es, básicamente, emulando:
arguments.slice(1); // discard 1st argument, gimme the rest
Sin embargo, no puede hacerlo directamente. El special arguments
object (disponible dentro del contexto de ejecución de todas las funciones de JavaScript), aunque Array-como en que admite la indexación a través del operador []
con teclas numéricas, no es realmente una matriz; No se puede .push
en él, .pop
fuera de él, o que .slice
, etc.
La forma en que el código logra esto es por "engañar" a la función slice
(que de nuevo no está disponible en el objeto arguments
) para ejecutar en el contexto dearguments
, a través de 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)
logra la misma cosa, pero hace una llamada ajena a splice(1)
, que elimina elementos de la array devuelto desde Array.prototype.slice.call(arguments)
comenzando en el índice 1
y continuando hasta el final de la matriz. splice(1)
no funciona en IE (técnicamente falta un segundo parámetro que indica cuántos elementos eliminar que IE y ECMAScript requieren).
Lo siento por la diferencia de código, pero he copiado el código que había pegado aquí http://stackoverflow.com/questions/373157/how- can-i-pass-a-reference-to-a-function-with-parameters de la respuesta a la que me he vinculado en esta pregunta, pero el autor cambió el script mientras tanto. Una vez más, perdón por eso –
@Andreas: check mah updatez –
¡Gran respuesta! +1 –