2016-03-31 19 views
1

Ich bin neu in js und ich versuche zu verstehen, wie apply hier verwendet wird (Ich habe mit dem Versuch zu versuchen, apply in letzter Zeit zu verstehen). Mein Problem ist jedoch zweifach. Zwar verstehe ich den Überblick über Mergesort, aber ich habe keine Ahnung, was im letzten Block passiert.Benötigen Sie Hilfe beim Verständnis von mergeSort und apply()

function mergeSort(items){ 

    if (items.length < 2) { 
     return items; 
    } 

    var middle = Math.floor(items.length/2), 
    left = items.slice(0, middle), 
    right = items.slice(middle), 
    params = merge(mergeSort(left), mergeSort(right)); 

    // Add the arguments to replace everything between 0 and last item in the array 
    params.unshift(0, items.length); 
    items.splice.apply(items, params); 
    return items; 
} 
+0

wo ist 'merge'? ohne zu sehen, was es ausspuckt, ist es schwer zu erklären. es ist zweifellos ein Splice sig, aber wie? – dandavis

Antwort

0

apply ist fast die gleiche wie call. Wenn Sie call verstehen, apply ist nur call, aber das zweite Argument ist ein Array von Argumenten. Zum Beispiel sind dies die gleichen:

function.call(object, arg1, arg2, ...) 
function.apply(object, [arg1, arg2, ...]) 

Ich bin mir nicht sicher, was Sie im letzten Block nicht verstehen. Aber ich nehme an, ist dieser Teil items.splice.apply(items, params);

Hier ist eine Aufschlüsselung. In js sind Funktionen nur Objekte. Und Objekte können Funktionen haben (oder Instanzmethoden, wie in vielen anderen OO-Sprachen).

Wenn Sie items.splice tun, alles, was Sie tun, ist nur in items zu erreichen, dann ziehen Sie die splice Funktion heraus (als ein Objekt). Dann verwenden Sie apply, um es aufzurufen. Das erste Argument von apply ist das Objekt, auf das Sie zugreifen. In Ihrem Beispiel ist items in der Klammer die, die splice Funktion aufruft, params ist ein Array von Argumenten.

1

In diesem Fall werden die Werte in params sind als Argumente verwendet werden soll, wenn Spleiß aufrufen. Wenn es 3 Mitglieder sagen, wäre der Anruf sein:

items.splice(params[0], params[1], params[2]); 

aber da es nicht vorher bekannt, wie viele Mitglieder da sein wird und damit, was der Anruf aussehen soll, gelten die Argumente übergeben werden kann, wie eine Anordnung. Jetzt brauchen Sie nicht zu wissen, wie viele es sind:

items.splice.apply(items, params); 

so der Aufruf effektiv:

items.splice(params[0], params[1], params[2], ..., params[n]); 

gelten auch Einstellung von diese erlaubt, und da das sein sollte Elemente, ist es als erstes Argument übergeben.

Verwandte Themen