Frage

ich über den folgenden Code kam:

var f = function () {
    var args = Array.prototype.slice.call(arguments).splice(1);

    // some more code 
};

Grundsätzlich ist das Ergebnis in args ist ein Array, das eine Kopie des arguments ohne sein erstes Element ist.

Aber was kann ich nicht genau verstehen, warum f der arguments (das ist ein Objekt, das die Funktion der eingegebenen Argumente in einem Array-ähnliches Objekt hält) Objekt an die slice Methode übergeben wird und wie slice(1) ist das Entfernen des ersten Elements ( positioniert am Index 0).

Kann jemand bitte es mir erklären?

P. S. Der Code ist von dieser Teilanwendungsfunktion

War es hilfreich?

Lösung


Der eigentliche Code aus, dass verknüpft Antwort ist:

var args = Array.prototype.slice.call(arguments, 1);

d. "Scheibe", nicht "splice"

Zu allererst wird die slice Methode häufig verwendet, um make a kopieren des Arrays auf genannt:

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']

So die kurze Antwort ist, dass der Code im Grunde emuliert:

arguments.slice(1); // discard 1st argument, gimme the rest

Sie können jedoch, dass nicht direkt tun. Das spezielles arguments Objekt (erhältlich in dem Ausführungskontext aller JavaScript-Funktionen ), obwohl Array- wie , dass es die Indizierung über den [] Operator mit Zifferntasten unterstützt, ist nicht wirklich ein Array; Sie können nicht .push auf sie, .pop von ihm weg, oder .slice es, etc.

Die Art und Weise der Code erreicht dies durch „austricksen“ die slice Funktion (die wiederum nicht zur Verfügung steht auf dem arguments Objekt) laufen im Zusammenhang mit arguments, über 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) führt die gleiche Sache, aber mach einen fremden Anruf splice(1), die entfernt Elemente aus dem Array von Array.prototype.slice.call(arguments) zurück am Index 1 beginnen und bis zum Ende des Arrays fortgesetzt. splice(1) funktioniert nicht in IE (es ist technisch einen zweiten Parameter fehlt es zu sagen, wie viele Elemente zu entfernen, dass der IE und ECMAScript benötigen).

Andere Tipps

var args = Array.prototype.slice.call(arguments).splice(1);

Zuerst nimmt eine Kopie arguments (*), entfernt dann alle, aber das erste Element von ihm (in einem Nicht-Standard-Weg), und Abtretungsempfänger diese Elemente zu args entfernt werden.

Die zusätzliche Anordnung erzeugt wird, dann verändert und weggeworfen ist ziemlich überflüssig. Besser wäre es, zu sagen - wie die Version in der Antwort, die Sie zu der Tat verknüpft tut:

var args = Array.prototype.slice.call(arguments, 1);

Teilfunktion Anwendung ist auch ein Merkmal der function.bind Methode, von ECMAScript Fifth Edition standardisiert. Bis Browser implementiert haben, können Sie eine ein Rückfall JS-native Version von der Unterseite der diese Antwort .

*: array.slice() ist das normale Idiom zum Kopieren eines Arrays und array.slice(1) für den Schwanz nehmen. Es hat es ausdrücklich durch die Array.prototype genannt werden, weil arguments kein Array ist, auch wenn es nur so aussieht, also nicht die normalen Array Methoden hat. Dies ist ein weiterer JavaScript ist seltsam Fehler.

Sie ziemlich oft sehen, wie Menschen die Array.prototype Methoden auf Objekte verwenden, die nicht Arrays sind; die ECMAScript Third Edition Standard geht der Weg zu sagen, das ist in Ordnung für die arguments Array-like, aber nicht zu tun, dass Sie es auch tun können auf anderen Array-mag, dass die Host-Objekte sein können, wie NodeList oder HTMLCollection. Obwohl Sie Array.prototype Methoden auf einem Nicht-Array in vielen Browsern mit Aufruf heute wegkommen könnten, zu tun, der einzige Ort, es tatsächlich sicher ist, so ist auf arguments.

Der zurückgegebene Wert einer Spleißung ist eine Anordnung der Elemente, die entfernt wurden, aber das Original-Array (oder Array-like object), wird an dem Spleißstelle Index abgeschnitten.

Eine Kopie mit Scheibe bewahrt die ursprüngliche Argumente Array, vermutlich für die spätere Verwendung in der Funktion.

In diesem Fall kann das gleiche Ergebnis mit args = [].slice.call(arguments, 1) hat sein

function handleArguments(){
 var A= [].slice.call(arguments).splice(1);
 //arguments is unchanged
 var s= 'A='+A+'\narguments.length='+arguments.length;

 var B= [].splice.call(arguments, 1);
 // arguments now contains only the first parameter
 s+= '\n\nB='+B+'\narguments.length='+arguments.length;
 return s;
}

// test
alert(handleArguments(1, 2, 3, 4));

returned value:
//var A= [].slice.call(arguments).splice(1);
A=2,3,4
arguments.length=4

//var B= [].splice.call(arguments, 1);
B=2,3,4
arguments.length=1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top