2015-08-31 12 views
5

I haben eine Funktion in a ES6 class:ES6 in Chrom - Babel Sourcemaps Pfeil und Funktionen lexikalischen Gültigkeitsbereich

class Test { 
    // Omitted code for brevity 
    loadEvents() { 
     $.get('/api/v1/events', (data) => { 
     this.actions.setEvents(data); 
     }); 
    } 
} 

Babel transpiles dies zu einer anderen Form, und es erzeugt ein _this Variable den lexikalischen Gültigkeitsbereich des steuern Pfeilfunktion.

var _this = this; 

$.get('/api/v1/events', function (data) { 
    _this.actions.setEvents(data); 
}); 

Wenn ich Debuggen des ES6 Klasse sourcemaps in Chrome und einen Haltepunkt auf der Linie setzen, wo ich this.actions.setEvents(data); nenne ich bemerkt, dass Chrome nicht „re-map“ this den ursprünglichen ES6 Code übereinstimmen, sondern this zeigt auf den äußeren Funktionsumfang und ich muss _this verwenden, wenn ich auf den lexikalischen Bereich der Pfeilfunktion zugreifen möchte, was völlig sinnlos ist. Wenn ich Quellkarten verwende, würde ich Chrome Dev erwarten. Werkzeuge, um den lexikalischen Umfang von this wie in meinem ES6-Code zu erhalten.

Gibt es eine Möglichkeit, Chrome-Entwicklertools wie erwartet mit Quellkarten und Pfeilfunktionen zu arbeiten?

+0

_ "dies deutet auf die äußere Funktion hin" _ - Es ist mir nicht klar, was Sie damit meinen. Ist der Wert von 'this' eine Funktion? _ "Ich muss _this verwenden, wenn ich auf den Pfeilfunktionsbereich zugreifen möchte" _ - Was haben '_this' und' this' mit dem Umfang einer Funktion zu tun? – zeroflagL

Antwort

6

Nun,

  1. Chromium verwendet nicht die Zuordnungen von names zur Zeit. https://code.google.com/p/chromium/issues/detail?id=327092

  2. this ist eine spezielle Bindung, so wie es transpiliert wird, wäre das nicht möglich. Das einzige, was ich denken kann, würde es so sein transpiling, aber ich weiß nicht, ob es rentabel ist:

    $.get('/api/v1/events', function (data) { 
        this.actions.setEvents(data); 
    }.bind(this)); 
    
+0

Sie sagen also, dass ein In-Browser-Debugger wie Chrome nicht in der Lage wäre, den Aufruf von "this" in den verschiedenen Tools (z. B. dem Überwachungsfenster oder der Konsole) abzufangen und ihn auf etwas anderes zu übertragen? Ich weiß, 'this' ist ein spezieller Wert, und das tatsächliche' this' ist natürlich nicht etwas, das modifiziert werden kann, aber ich spreche mehr über einige fortgeschrittene Debugger-Funktionen. –

+0

Wahrscheinlich technisch könnte es, aber wie würde es funktionieren? Du musst in der Lage sein, den wahren Wert von 'this' zu prüfen. Ich weiß nicht, dass etwas tun, um die Werte spezieller Bindungen zu verschleiern, so ist das eine gute Idee. – JMM

+0

ja, vielleicht. Aber was ist der Sinn von SourceMaps, wenn Sie den Code im ursprünglichen ES6-Zustand nicht debuggen können? Es ist sehr verwirrend und definitiv ein ziemlich großes Problem in meinem Buch. Wenn ich einen Breakpoint in eine Arrow-Funktion setze, muss ich überprüfen, was die tatsächliche _self/_this-Variable im übertragenen Code ist, und dann kann ich richtig debuggen, was wie ein mühsamer Debugging-Workflow aussieht. –

0

bei Babel arrow function transformer Sehen, wie es scheint es bereits die bind implementiert (this) Lösung , wodurch der Debugger das richtige anzeigt.

Ich habe es in meinen Chrom-Entwickler-Tools getestet.

Verwandte Themen