Frage

Dies ist ein sehr konstruiertes Beispiel, aber nehmen wir an, wir erstellen eine Variable _this irgendwo in einer Klassenfunktion.

class Person {
  constructor (public name : string) {}
  changeName(name) {
    var _this = {};
    (() => {
      this.name = name;
    })();
  }
}

Dies wird nicht wie erwartet funktionieren, wenn wir das anrufen changeName Funktion, da der relevante Teil des kompilierten Codes so aussieht:

var _this = this;
var _this = {};
(function () {
  _this.name = name;
})();

Das ist schlechtes Javascript:wir haben zwei var Deklarationen überschreiben sich gegenseitig.Der _this Die vom Compiler erstellte Datei wird von mir überschrieben _this.

Soweit ich sehen kann, ist dieses Verhalten in der TypeScript-Spezifikation nicht spezifiziert.

Warum sollten sie in Konflikt geraten?Der Compiler kann nicht erkennen, ob ich eine Variable mit dem Namen erstellt habe _this und benennen Sie das automatisch generierte anders, z _this2 um zu verhindern, dass meine und die vom Compiler generierten Variablen sich gegenseitig mit Füßen treten?

War es hilfreich?

Lösung

Der Compiler erstellt automatisch _this als Hinweis auf this um den Abschluss zu erleichtern, der mithilfe der Lambda-Syntax erstellt wird.Ich bin mir ziemlich sicher, dass ich das irgendwo in der TypeScript-Spezifikation gelesen habe, aber ich stimme zu, dass der Compiler in diesem Fall einen Fehler ausgeben sollte.

Mir gefällt die Idee nicht, dass der Compiler variiert, wie er Javascript ausgibt, da dies im Widerspruch zum erklärten Ziel steht, „idiomatisches“ (und daher vorhersehbares) Javascript zu generieren.

Andere Tipps

Ist es nicht das, was Sie eine reservierte Variable nennen würden?Ich vermute, Sie würden auch keine Variable namens „this“ oder „document“ deklarieren.

Solange MS klar ist, was die reservierten Variablen sind, glaube ich nicht, dass es ein großes Problem gibt.Sie könnten jedoch möglicherweise den Compiler verbessern, um Warnungen auszugeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top