2015-01-19 6 views
13

Ich habe folgende ES6 Code einen fetten Pfeil Funktion:ES6 Pfeil Funktion lexikalischer dies in V8

var test = { 
    firstname: 'David', 
    fn: function() { 
    return ['one', 'two', 'tree'].map(() => this.firstname) 
    } 
} 
console.log(test.fn()) 

Je nachdem, wie Pfeil Funktionen sollen arbeiten würde ich erwarten this das test Objekt sein. ES6Fiddle, erzeugen Traceur und Firefox die erwartete Ausgabe, die ["David", "David", "David"] ist.

Beim Aktivieren dieser Funktionen in Chrome mit chrome://flags/#enable-javascript-harmony, bekomme ich jedoch [undefined, undefined, undefined]. Wenn Sie console.log(this) es zeigt, dass es das Fensterobjekt ist und Sie einen Fehler im strikten Modus erhalten. Ist die lexikalische this für ES6-Pfeilfunktionen in V8 noch nicht implementiert?

+1

Funktioniert einwandfrei in FF. Ich denke, dass die Implementierung von Chrome dort immer noch schlampig ist. – jAndy

+2

Ab November letzten Jahres: https://code.google.com/p/v8/issues/detail?id=2700#c28 –

+5

Ja, 'this' Bindung in Pfeil-Funktionen ist Chrome das größte Problem gerade jetzt. Auf unserem Test in compat table implementiert es nur 4 von 9 - http://kangax.github.io/compat-table/es6/#arrow_functions – kangax

Antwort

11

Lexikal this ist der letzte Teil der ES6 Pfeilfunktionen in V8 landen und es ist der Grund, warum es immer noch hinter einer Flagge und noch nicht versandbereit ist. Adrian Perez bei Igalia implementiert Pfeilfunktionen und der finale Patch ist fast fertig zum Landen, sobald ein paar TurboFan-Probleme ausgearbeitet sind: https://codereview.chromium.org/883823002/

+0

Es scheint der Pfeil Die Funktion wurde in Chrome 45.0.2429+ unter der Flagge "chrome: // flags/# enable-javascript-harmony" ausgeliefert. http://wingolog.org/archives/2015/06/18/arrow-functions-coming- to-chrome-45 # Kommentare –

+0

@AlexandrSkach kov danke Cpt. Offensichtlich. Aber wie hilft das dem oben genannten Problem, dass Pfeilfunktionen in Klassenmethoden unter V8 nicht an das Lexikalische zu binden scheinen? – kernel

+1

@kernel, Pfeile Versand bedeutet, dass ihre Implementierung abgeschlossen wurde, so dass das Problem nicht mehr besteht. –

1

Der dicke Pfeil ist eine Eigenschaft von ES6. Es wurde in Firefox (Gecko), aber noch nicht in anderen Browsern eingeführt (und schon gar nicht vollständig in V8, die für NodeJS wäre interessant/iojs Entwicklung) .Hier ist eine Referenz doc

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility

Anyways Wenn Sie brauchen der Umfang bindend, dann statt =>bind() verwenden. Hier ist ein einfaches Beispiel.

Statt dessen.

$("#example").on("click",() => { 
    // your code goes here 
}); 

Verwenden Sie dies.

$("#example").on("click", (function() { 
    // your code goes here 
}).bind(this)); 

Wenn Sie den Umfang nicht benötigen, dann tun Sie es einfach.

$("#example").on("click", function() { 
    console.log("example"); 
}); 
+0

Die Pfeile sind in V8 an dieser Stelle vollständig und werden bereits ohne Flagge versandt. Chrome 45 (bald in der Betaversion) wird sie abholen. –

+0

Ich bin mir nicht sicher, ob Referenzdokument tatsächlich ist. Ich würde es bevorzugen, http://kangax.github.io/compat-table/es6/#chrome45 zu verwenden –