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?

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top