Должно ли создание переменной с именем _this конфликтовать с этим?
-
13-12-2019 - |
Вопрос
Это очень надуманный пример, но давайте предположим, что мы создаем переменную _this
где-то в функции класса.
class Person {
constructor (public name : string) {}
changeName(name) {
var _this = {};
(() => {
this.name = name;
})();
}
}
Это не будет работать должным образом, когда мы вызовем changeName
функция, потому что соответствующая часть скомпилированного кода выглядит так:
var _this = this;
var _this = {};
(function () {
_this.name = name;
})();
Это плохой Javascript:у нас есть двое var
декларации перезаписывают друг друга.А _this
созданный компилятором, перезаписывается моим _this
.
Насколько я вижу, такое поведение не указано в спецификации TypeScript.
Почему они должны конфликтовать?Не может компилятор определить, создал ли я переменную с именем _this
и назовите автоматически сгенерированный файл как-нибудь по-другому, например _this2
чтобы мои переменные и переменные, сгенерированные компилятором, не попирали друг друга?
Решение
Компилятор автоматически создаст _this
как ссылка на this
чтобы облегчить замыкание, которое будет создано с использованием синтаксиса лямбда.Я почти уверен, что читал это где-то в спецификации TypeScript, но я согласен, что в этом случае компилятор должен выдать ошибку.
Мне не нравится идея, что компилятор меняет способ генерации javascript, поскольку это противоречит заявленной цели создания «идиоматического» (и, следовательно, предсказуемого) javascript.
Другие советы
Разве это не то, что вы бы назвали зарезервированной переменной?Я думаю, вы также не стали бы объявлять переменную с именем «this» или «document».
Пока MS ясно понимает, что такое зарезервированные переменные, я не думаю, что это серьезная проблема.Хотя, возможно, они могли бы улучшить компилятор для вывода предупреждений.