2016-07-06 4 views
0

ich habe die FunktionUnbekannte JavaScript-Funktion

function bind(method, context) { 
    var args = Array.prototype.slice.call(arguments, 2); 
    return function() { 
     var a = args.concat(Array.prototype.slice.call(arguments, 0)); 
     return method.apply(context, a); 
    } 
} 

Die Frage war: wie diese Funktion arbeiten und wofür sie verwendet werden kann.

Ich verstehe, dass Funktion binden (und Return-Funktion auch) Array-artige Argumente in ein reales Array konvertieren. Methode und Kontext werden nicht in Array konvertiert (wegen 2 Index). Ich kann zusätzliche Argumente in Bindefunktion und Argumente in zurückgegebene Funktion übergeben und Methode mit Kontext als 'dies' aufrufen.

Meine Frage ist - wie kann es in welchen Fällen verwendet werden. Ist Methode und Kontext - Funktion oder Objekte oder Funktion und Objekt?

+4

Es tut das gleiche, dass ['Function.prototype.bind()'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind) tut – zerkms

Antwort

1

Diese Funktion ist üblich, um eine Event-Handler-Funktion zu erzeugen.

Wenn Sie zum Beispiel Ihre Funktion für ein Ereignis abonnieren und die Funktion this aufgerufen wird, hängt davon ab, welcher Aufruf Ihr Handler.

Wenn Sie eine Methode Ihres Objekts statt einer Funktion übergeben, möchten Sie auf Ihr Objekt zugreifen, indem Sie this.

Die ersten beiden Argumente der Funktion sind die Methode (die Funktion, die Sie binden möchten), der Kontext (das Objekt, auf das Sie zugreifen möchten this) und Sie könnten weitere feste Argumente hinzufügen, die an Ihren Handler übergeben werden Funktion wird jedes Mal aufgerufen.

Dann gibt die Funktion eine neue Funktion zurück, die Sie verwenden, um den gewünschten Ereignislistener zu subskribieren, und diese Funktion ruft alle von diesem Ereignis übergebenen Argumente ab und fügt sie zum Array arguments hinzu.

Und schließlich die Magie mit apply, die Sie eine Funktion aufrufen können den Kontext ändern und übergeben ein beliebiges Array als Argumente der Funktion.

Sie könnten diese Art von Funktion nicht nur in Ereignis-Abonnement, sondern auch in Anruf wie Array forEach, map und so weiter verwenden.

+0

Danke sehr, Zerkms und Mario! Beide Antworten sind sehr nützlich für mich. Ich verstehe, wie es funktioniert und wofür es verwendet werden kann. Vielen Dank für diese Erklärung! – Lucky