Должно ли создание переменной с именем _this конфликтовать с этим?

StackOverflow https://stackoverflow.com//questions/12710303

  •  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 ясно понимает, что такое зарезервированные переменные, я не думаю, что это серьезная проблема.Хотя, возможно, они могли бы улучшить компилятор для вывода предупреждений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top