2016-07-23 18 views
3

Ich stieß auf diesen Ajax Anruf. Es funktioniert völlig in Ordnung:Was ist() => Operator?

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success:() => { 
     this.updateItems(item); 
    } 
}); 

ich nicht bekommen, was () => Mittel. Ich habe Erfolg: function(){ } aber dann gibt es mir einen Fehler

„updateItems ist keine Funktion“

+2

Dies wird als "Pfeilfunktion" bezeichnet, eine neue Möglichkeit, Funktionen in es6 zu deklarieren. [Hier] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) ist die MDN-Dokumentation und [hier] (http://stackoverflow.com/documentation/ javascript/186/functions # t = 201607230227390313154) ist die neue StackOverflow-Dokumentation! –

+2

Das ist eine ES6-Lambda-Funktion. Der Grund dafür, dass Sie bei einer normalen Funktion einen Fehler bekommen, ist, dass in lambdas "dies" einen anderen Bereich hat. – VSG24

+0

Danke für die Antwort. Immer noch eine Sorge. Wenn seine neue Art, Funktion zu deklarieren, vorwärts geht, funktioniert die alte Wegfunktion() {} nicht? – user2015

Antwort

3

Das Konstrukt wird ein Pfeil-Funktion aufgerufen. Es wurde mit dem ES2015 Standard eingeführt und funktioniert ähnlich wie die function() {} Syntax.

Für weitere Informationen, check the MDN docs.

Beachten Sie, dass diese Syntax noch nicht von allen Browsern unterstützt wird, insbesondere ältere Versionen. Sie sollten daher in transpiling it into ES5 compliant JavaScript schauen.


Der Grund, warum Ihr Versuch, sie in eine klassische function() {} nicht zu transformieren ist, dass klassische Funktionen ihren eigenen this Wert definieren, während der Pfeil Funktionen der this Wert der umgebenden Funktion verwenden. Deshalb kann this.updateItems nicht mehr gefunden werden.

Um dies zu beheben, bindet die Funktion Kontext manuell:

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success: function() { 
     this.updateItems(item); 
    }.bind(this) 
}); 
+1

Damit dies eine richtige Antwort ist, beantworten Sie bitte die Frage von OP über den Fehler, den sie erhalten. Dies ergibt sich aus dem Unterschied in der Art und Weise, wie "this" unter Verwendung der Pfeilsyntax beschränkt wird. –

+0

@ this-vidor Fertig! :-) – Timo

+1

Schön! (Der Downvote war nicht meiner.) –

0

Es ist eine Pfeil-Funktion, und ist wie eine anonyme Funktion, die auch this bindet. Wenn Sie es auf eine Funktion() umgestellt haben, war die this an etwas anderes gebunden, daher der Fehler.

Edit:

Wenn Sie immer noch eine eher traditionelle Syntax verwenden möchten, dann verwenden:

function(){/*...*/}.bind(this) 

, die Sie das richtige Objekt gebunden wird sichergestellt sind.

+0

** Erkläre den Unterschied! "Etwas anderes" ist nicht hilfreich. –

+0

@ this-vidor Ich dachte, ich hätte es getan. Der Schlüssel zu seinem Fehler war die Art und Weise, in der sich die Bindung unterschied, was ich erklärte. – seairth

+0

JavaScript ist deterministisch. "Etwas anderes" ist in diesem Fall ein sehr spezifisches Etwas. Woran ist "das" bei der Verwendung der Funktionssyntax gebunden? Ihre Bearbeitung ist viel hilfreicher, aber immer noch schlampig. –