833 Stimmen

Wozu dient die JavaScript-Methode "bind"?

Was ist der Nutzen von bind() in JavaScript?

0 Stimmen

Die aufrufende Funktion kann man sich vorstellen als ptr.func() und es ist die ptr die den Kontext liefern.

843voto

nkron Punkte 17828

Bind erstellt eine neue Funktion, die die this innerhalb der Funktion als Parameter, der an bind() .

Hier ist ein Beispiel, das zeigt, wie man bind eine Mitgliedsmethode zu übergeben, die die richtige this :

var myButton = {
  content: 'OK',
  click() {
    console.log(this.content + ' clicked');
  }
};

myButton.click();

var looseClick = myButton.click;
looseClick(); // not bound, 'this' is not myButton - it is the globalThis

var boundClick = myButton.click.bind(myButton);
boundClick(); // bound, 'this' is myButton

Das wird ausgedruckt:

OK clicked
undefined clicked
OK clicked

Sie können auch zusätzliche Parameter nach dem ersten ( this ) Parameter und bind wird diese Werte an die ursprüngliche Funktion weitergeben. Alle zusätzlichen Parameter, die Sie später an die gebundene Funktion übergeben, werden nach den gebundenen Parametern übergeben:

// Example showing binding some parameters
var sum = function(a, b) {
  return a + b;
};

var add5 = sum.bind(null, 5);
console.log(add5(10));

Das wird ausgedruckt:

15

Überprüfen Sie JavaScript Funktion binden für weitere Informationen und interaktive Beispiele.

Update: ECMAScript 2015 bietet Unterstützung für => Funktionen. => Funktionen sind kompakter und verändern nicht die this Zeiger aus ihrem Definitionsbereich, so dass Sie möglicherweise nicht bind() wie oft. Wenn Sie zum Beispiel eine Funktion für Button aus dem ersten Beispiel, um die Verbindung zwischen click Callback zu einem DOM-Ereignis, die folgenden sind alle gültige Möglichkeiten, das zu tun:

var myButton = {
  ... // As above
  hookEvent(element) {
    // Use bind() to ensure 'this' is the 'this' inside click()
    element.addEventListener('click', this.click.bind(this));
  }
};

Oder:

var myButton = {
  ... // As above
  hookEvent(element) {
    // Use a new variable for 'this' since 'this' inside the function
    // will not be the 'this' inside hookEvent()
    var me = this;
    element.addEventListener('click', function() { me.click() });
  }
};    

Oder:

var myButton = {
  ... // As above
  hookEvent(element) {
    // => functions do not change 'this', so you can use it directly
    element.addEventListener('click', () => this.click());
  }
};

9 Stimmen

Hervorragende Erläuterung, aber es fällt mir schwer, Beispiele zu finden, in denen ich die von Ihnen beschriebene dritte Option anstelle der ersten Option verwenden würde. Können Sie Situationen beschreiben, in denen Sie das Gefühl hatten, die dritte Option verwenden zu müssen?

8 Stimmen

@Darryl - Ein Grund dafür wäre die Übergabe von Parametern von Event-Handlern. Wenn Sie diesen React-Code haben: var Note = React.createClass({ add: function(text){ ... }, render: function () { return <button onClick={this.add.bind(null, "New Note")}/> } } Wenn die Schaltfläche angeklickt wird, wird ein Parametertext "Neue Notiz" an die add Methode.

0 Stimmen

Gibt es eine Möglichkeit, function({}.bind) zu tun? ich erhalte Uncaught TypeError: (intermediate value)(...)

376voto

Renganathan M G Punkte 4689

Die einfachste Verwendung von bind() ist es, eine Funktion zu schaffen, die unabhängig von wie sie aufgerufen wird, mit einer bestimmten this Wert.

x = 9;
var module = {
    x: 81,
    getX: function () {
        return this.x;
    }
};

module.getX(); // 81

var getX = module.getX;
getX(); // 9, because in this case, "this" refers to the global object

// create a new function with 'this' bound to module
var boundGetX = getX.bind(module);
boundGetX(); // 81

Weitere Informationen finden Sie unter diesem Link auf MDN Web Docs:

Funktion.prototype.bind()

60 Stimmen

Die beste Einführung in bind(), die ich je gesehen habe.

6 Stimmen

Gute Antwort, denn Ihr Beispiel erfordert keine Kenntnisse über Sprachmerkmale (z. B. prototype ), die für Anfänger neu sein könnten.

193voto

Jhankar Mahbub Punkte 9404

binden erlaubt-

  • den Wert von "this" auf ein bestimmtes Objekt setzen. Dies ist sehr hilfreich, da manchmal este ist nicht das, was beabsichtigt ist.
  • Wiederverwendungsmethoden
  • eine Funktion striegeln

Sie haben zum Beispiel eine Funktion zum Abzug der monatlichen Clubgebühren

function getMonthlyFee(fee){
  var remaining = this.total - fee;
  this.total = remaining;
  return this.name +' remaining balance:'+remaining;
}

Nun möchten Sie diese Funktion für ein anderes Clubmitglied wiederverwenden. Beachten Sie, dass die monatliche Gebühr von Mitglied zu Mitglied unterschiedlich ist.

Nehmen wir an, Rachel hat ein Guthaben von 500 und einen monatlichen Mitgliedsbeitrag von 90.

var rachel = {name:'Rachel Green', total:500};

Erstellen Sie nun eine Funktion, die immer wieder verwendet werden kann, um die Gebühr jeden Monat von ihrem Konto abzubuchen

//bind
var getRachelFee = getMonthlyFee.bind(rachel, 90);
//deduct
getRachelFee();//Rachel Green remaining balance:410
getRachelFee();//Rachel Green remaining balance:320

Nun könnte dieselbe getMonthlyFee-Funktion für ein anderes Mitglied mit einem anderen Mitgliedsbeitrag verwendet werden. Beispiel: Ross Geller hat ein Guthaben von 250 und eine monatliche Gebühr von 25

var ross = {name:'Ross Geller', total:250};
//bind
var getRossFee = getMonthlyFee.bind(ross, 25);
//deduct
getRossFee(); //Ross Geller remaining balance:225
getRossFee(); //Ross Geller remaining balance:200

12 Stimmen

In Ihrem Beispiel wäre ich geneigt, ein Mitgliedsobjekt einzurichten, das mit dem Schlüsselwort new instanziiert wird, wobei jedes Mitglied seine eigenen Eigenschaften/Methoden hat. Dann ist es einfach eine Frage von ross.getMonthlyFee(25). War dieses Beispiel nur dazu gedacht, die Verwendung von bind() zu demonstrieren, oder gibt es einen Vorteil für Ihren Ansatz?

0 Stimmen

Ich liebe das Curry und die Funktion!

0 Stimmen

Ich weiß nicht, aber ich würde tun var getRachelFee = getMonthlyFee(rachel, 90); Und Funktion wäre function getMonthlyFee(member,fee){} etwas in der Richtung.

97voto

John Slegers Punkte 41127

Von die MDN-Dokumente auf Function.prototype.bind() :

El bind() Methode erzeugt eine neue Funktion, die beim Aufruf ihre this-Schlüsselwort auf den angegebenen Wert gesetzt wird, wobei eine bestimmte Folge von Argumenten, die beim Aufruf der neuen Funktion vor den angegebenen Argumenten stehen.

Und was bedeutet das?!

Nun, nehmen wir eine Funktion, die wie folgt aussieht:

var logProp = function(prop) {
    console.log(this[prop]);
};

Nehmen wir nun ein Objekt, das wie folgt aussieht:

var Obj = {
    x : 5,
    y : 10
};

Wir können unsere Funktion wie folgt an unser Objekt binden:

Obj.log = logProp.bind(Obj);

Jetzt können wir Obj.log irgendwo in unserem Code:

Obj.log('x'); // Output : 5
Obj.log('y'); // Output : 10

Das funktioniert, weil wir den Wert von this zu unserem Objekt Obj .


Wirklich interessant wird es, wenn Sie nicht nur einen Wert für this sondern auch für sein Argument prop :

Obj.logX = logProp.bind(Obj, 'x');
Obj.logY = logProp.bind(Obj, 'y');

Das können wir jetzt tun:

Obj.logX(); // Output : 5
Obj.logY(); // Output : 10

Anders als bei Obj.log müssen wir nicht bestehen x o y weil wir diese Werte bei der Bindung übergeben haben.

11 Stimmen

Diese Antwort sollte mehr Aufmerksamkeit erhalten. Gut erklärt.

0 Stimmen

Sehr gute Kombination aus allgemeinem Überblick und konkretem Beispiel.

0 Stimmen

Wo ist der Knopf, mit dem man direkt 100 Up's schießt?

25voto

krati agarwal Punkte 251

Variablen haben einen lokalen und einen globalen Geltungsbereich. Nehmen wir an, dass wir zwei Variablen mit demselben Namen haben. Die eine ist global definiert und die andere ist innerhalb einer Funktions-Schließung definiert, und wir wollen den Wert der Variablen erhalten, die sich innerhalb der Funktions-Schließung befindet. In diesem Fall verwenden wir diese bind()-Methode. Bitte sehen Sie sich das folgende einfache Beispiel an:

var x = 9; // this refers to global "window" object here in the browser
var person = {
  x: 81,
  getX: function() {
    return this.x;
  }
};

var y = person.getX; // It will return 9, because it will call global value of x(var x=9).

var x2 = y.bind(person); // It will return 81, because it will call local value of x, which is defined in the object called person(x=81).

document.getElementById("demo1").innerHTML = y();
document.getElementById("demo2").innerHTML = x2();

<p id="demo1">0</p>
<p id="demo2">0</p>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X