Должно ли создание переменной с именем _this конфликтовать с этим?
Это очень надуманный пример, но давайте предположим, что мы создаем переменную _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
чтобы мои переменные и сгенерированные компилятором не попирали друг друга?
2 ответа
Компилятор автоматически создаст _this
в качестве ссылки на this
чтобы облегчить закрытие, которое будет создано с использованием лямбда-синтаксиса. Я почти уверен, что где-то читал это в спецификации TypeScript, но я согласен, что в этом случае компилятор должен выдать ошибку.
Мне не нравится, что компилятор изменяет то, как он генерирует javascript, поскольку это противоречит заявленной цели создания "идиоматического" (и, следовательно, предсказуемого) javascript.
Разве это не то, что вы бы назвали зарезервированной переменной? Я предполагаю, что вы не объявите переменную с именем this или document.
Пока MS ясно знает, что зарезервированные переменные, я не думаю, что есть большая проблема. Возможно, они могли бы улучшить компилятор для вывода предупреждений.