2015-08-31 17 views
5

Mam funkcji wewnątrz ES6 class:ES6 w Chrome - Babel Sourcemaps i Arrow Funkcje zakres leksykalny

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

Babel transpiles to do innej formie, a to generuje _this zmienną kontrolować zakres leksykalny z następujących funkcja strzałki.

var _this = this; 

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

Kiedy debugować klasę ES6 korzystając sourcemaps w Chrome i umieścić punkt przerwania na linii, gdzie zgłoszę this.actions.setEvents(data); zauważyłem, że Chrome nie „re-map” this dopasować oryginalny kod ES6, ale zamiast this wskazuje na zewnętrzny zakres funkcji i muszę użyć _this, jeśli chcę uzyskać dostęp do zakresu leksykalnego funkcji strzałki, co jest całkowicie bezcelowe. Jeśli używam sourcemaps, spodziewam się, że będzie to Chrome. narzędzia do zachowania zakresu leksykalnego this jak w moim kodzie ES6.

Czy istnieje sposób na to, aby narzędzia programistów Chrome działały zgodnie z oczekiwaniami dzięki funkcjom strzałki i strzałki?

+0

_ "to wskazuje na zewnętrzną funkcję" _ - Nie jest dla mnie jasne, co przez to rozumiesz. Czy wartość 'this' jest funkcją? _ "Muszę użyć _to jeśli chcę uzyskać dostęp do zakresu funkcji strzałki" _ - Co te "_to" i "to" ma wspólnego z zakresem funkcji? – zeroflagL

Odpowiedz

6

No

  1. Chromium nie wykorzystuje mapowania z names komunikatu. https://code.google.com/p/chromium/issues/detail?id=327092

  2. this jest specjalnym wiązaniem, więc sposób w jaki jest transponowany nie byłby możliwy. Jedyną rzeczą, jaką mogę myśleć byłoby transpiling to tak, ale nie wiem, czy jest to opłacalne:

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

Więc mówisz, że debugger w przeglądarce, taki jak Chrome, nie byłby w stanie przechwycić wezwania do "tego" w różnych narzędziach (np. W oknie Watch lub w konsoli) i zmienić go na inny? Wiem, że 'this' jest specjalną wartością, a rzeczywiste' this' nie jest oczywiście czymś, co można zmodyfikować, ale bardziej mówię o niektórych zaawansowanych funkcjach debuggera. –

+0

Prawdopodobnie to technicznie możliwe, ale jak by to działało? Musisz być w stanie sprawdzić prawdziwą wartość "tego". Nie wiem, czy zrobienie czegokolwiek, by zasłonić wartości specjalnych wiązań, to dobry pomysł. – JMM

+0

tak, może. Ale znowu, jaki jest sens SourceMaps, jeśli nie można debugować kodu w oryginalnym stanie ES6? Jest to bardzo zagmatwany i zdecydowanie dość duży problem w mojej książce. Jeśli umieściłem punkt przerwania w funkcji strzałki, muszę sprawdzić, jaka jest rzeczywista zmienna _/_to w transpiled-code, a następnie mogę poprawnie debugować, co wydaje się nużącym workflow debugowania. –

0

Patrząc na Babel arrow function transformer, wydaje się, że już implementuje wiążą rozwiązanie (this) , co sprawia, że ​​debugger wyświetla to poprawnie.

Przetestowałem to w moich narzędziach do tworzenia Chrome.

Powiązane problemy