Sollte das Erstellen einer Variablen namens _this damit in Konflikt stehen?
-
13-12-2019 - |
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?
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.