2015-08-31 17 views
5

Ho una funzione all'interno di un ES6 class:ES6 in Chrome - Babel Sourcemaps e freccia Funzioni scope lessicale

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

Babel transpiles questo ad una forma differente e genera una variabile _this per controllare l'ambito lessicale funzione di freccia.

var _this = this; 

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

Quando il debug della classe ES6 utilizzando sourcemaps in Chrome e mettere un punto di interruzione sulla linea in cui io chiamo this.actions.setEvents(data); ho notato che Chrome non "ri-mappa" this per abbinare il codice ES6 originale, ma invece this punta allo scope della funzione esterna e ho bisogno di usare _this se voglio accedere alla funzione lessicale della funzione freccia, che è completamente inutile. Se sto usando sourcemaps mi aspetterei che lo sviluppo di Chrome. strumenti per preservare l'ambito lessicale di this come nel mio codice ES6.

C'è un modo per fare in modo che gli strumenti di sviluppo di Chrome funzionino come previsto con sourcemaps e funzioni freccia?

+0

_ "questo indica la funzione esterna" _ - Non mi è chiaro cosa intendi con questo. Il valore di 'this' è una funzione? _ "Ho bisogno di usare _questo se voglio accedere all'ambito della funzione freccia" _ - Cosa c'e '_questo? e 'questo? ha a che fare con lo scopo di una funzione? – zeroflagL

risposta

6

Beh,

  1. Chromium non utilizza le mappature da names attualmente. https://code.google.com/p/chromium/issues/detail?id=327092

  2. this è un binding speciale, quindi il modo in cui è transpiled non sarebbe possibile farlo. L'unica cosa che mi viene in mente sarebbe transpiling in questo modo, ma non so se è fattibile:

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

Quindi stai dicendo che un debugger nel browser come Chrome non sarebbe in grado di intercettare la chiamata per "questo" nei diversi strumenti (ad esempio la finestra Watch o Console) e re-mapparla a qualcos'altro? so che questo è un valore speciale, e il vero 'questo 'non è ovviamente qualcosa che può essere modificato, ma sto parlando di alcune funzioni avanzate di debugger. –

+0

Probabilmente tecnicamente potrebbe, ma come funzionerebbe? Devi essere in grado di ispezionare il valore reale di "questo". Non so che fare qualcosa per oscurare i valori degli attacchi speciali come questa è una buona idea. – JMM

+0

sì, forse. Ma ancora qual è il punto di SourceMaps se non è possibile eseguire il debug del codice nello stato ES6 originale? È molto confuso e decisamente un grosso problema nel mio libro. Se metto un breakpoint in una funzione Arrow ho bisogno di controllare qual è la variabile _self/_questa effettiva nel codice transpiled e quindi posso eseguire il debug in modo corretto, il che sembra un noioso flusso di lavoro di debug. –

0

Guardando Babel arrow function transformer, sembra che implementa già il bind (questo) soluzione , che rende il debugger visualizzato correttamente.

L'ho provato nei miei strumenti di sviluppo Chrome.

Problemi correlati