Dovrebbe creare una variabile denominata _Questa conflitto con questo?
-
13-12-2019 - |
Domanda
Questo è un esempio molto volto, ma supponiamo di creare un _this
variabile da qualche parte in una funzione di classe.
class Person {
constructor (public name : string) {}
changeName(name) {
var _this = {};
(() => {
this.name = name;
})();
}
}
.
Questo non funzionerà come previsto quando chiamiamo la funzione changeName
perché la parte rilevante del codice compilato è simile a questo:
var _this = this;
var _this = {};
(function () {
_this.name = name;
})();
.
Questo è Bad JavaScript: abbiamo due dichiarazioni var
che si sovraccarono l'un l'altro.Il _this
creato dal compilatore viene sovrascritto dal mio _this
.
Per quanto posso vedere, questo comportamento non è specificato nella specifica di tipo dattiloscritto.
Perché dovrebbero entrare in conflitto?Non è possibile rilevare il compilatore se ho creato una variabile denominata _this
e il nome generato automaticamente qualcos'altro, come _this2
per mantenere le mie variabili e quelle generate dal compilatore da calpestare l'un l'altro?
Soluzione
Il compilatore creerà automaticamente _this
come riferimento a this
per facilitare la chiusura che verrà creata utilizzando la sintassi della Lambda.Sono abbastanza sicuro di averlo letto nelle specifiche dattiloscritte da qualche parte, ma sarei d'accordo sul fatto che il compilatore dovrebbe emettere un errore in questo caso.
Non mi piace l'idea del compilatore che varia come emette JavaScript come questo conflitto con l'obiettivo dichiarato di generare JavaScript "idiomatic" (e quindi prevedibile).
Altri suggerimenti
Non è quello che chiameresti una variabile riservata?Immagino che non dichiarisse una variabile chiamata "questo" o "documento".
Finché MS è chiaro su ciò che le variabili riservate sono, non penso che ci sia un problema importante.Potrebbero forse migliorare il compilatore agli avvertimenti di uscita però.