Ecco un articolo spiega molto bene. Ho copiato alcuni punti chiave di seguito. http://www.javascriptkit.com/javatutors/arrayprototypeslice.shtml
Per array, ricordare che è possibile chiamare la funzione slice per ottenere un sub array.
var abc = [1,2,3,4,5];
abc.slice(0); //[1,2,3,4,5]
abc.slice(1,3); //[2,3]
Poiché l'argomento oggetto è solo array come, non proprio un array. La funzione call()/apply() fondamentalmente solo "prende in prestito" la funzione slice da Array e la usa sull'oggetto Argument, e puoi anche passare i parametri nella funzione slice proprio come agire sull'array.
var myobject ={ // array-like collection
length: 4,
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three'
}
var myarray = Array.prototype.slice.call(myobject)
// returns myobject as a true array: ["zero", "one", "two", "three"]
var myarray = Array.prototype.slice.call(myobject, 1)
// returns ["one", "two", "three"]
L'unica domanda che rimane è per questo che stiamo chiamando slice() sull'oggetto prototipo di Array invece di un'istanza array. Il motivo è perché questa è la via più diretta per accedere al metodo slice() di Array quando è tutto ciò di cui siamo interessati; avremmo potuto prima creato un'istanza Array, ma questo è meno efficiente e probabilmente più astruse:
var myarray = new Array().prototype.slice.call(myobject) // less efficient
Eh ...? Perché lo assumeresti? Ogni iterazione gestisce solo il primo elemento, quindi chiama se stesso con il resto finché non ne rimane nessuno. Non sono sicuro di cosa dovrebbe fare la tua versione. – mpen
Oh..nevermind. A causa della funzione anonima ... hai ragione, a parte il fatto che non dovrebbe ancora passare nel primo elemento ... dovrebbe passare tutto tranne il primo. – mpen
@Mark: hai 2 funzioni. Forse ho sbagliato, ma ho interpretato la tua domanda come se volessi passare 'arguments' da' runScripts() '* a * il callback che stai passando a' executeScript'. Non è un'ipotesi strana da fare dato che stai facendo riferimento a 'arguments [0]' * outside * al callback, quindi provando a '.shift()' * dentro * il callback. – user113716