Если создать переменную с именем _this конфликт с этим?

голоса
2

Это очень надуманный пример, но давайте предположим , что мы создаем переменную _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.

Насколько я понимаю, это поведение не указано в спецификации машинописи.

Почему они должны конфликтовать? Компилятор не может обнаружить , если я создал переменную с именем _thisи имя автоматически сгенерированной одно что - то еще, хотел , _this2чтобы мои переменные и сгенерированного компилятором те из попирая друг с другом?

Задан 03/10/2012 в 15:08
источник пользователем
На других языках...                            


2 ответов

голоса
7

Компилятор автоматически создаст в _thisкачестве ссылки для thisсодействия закрытия , которая будет создана с помощью синтаксиса лямбды. Я уверен , что я прочитал это в спецификации машинописи где - то, но я согласен , что компилятор должен генерировать ошибку в данном случае.

Мне не нравится идея компилятора меняющегося, как он излучает JavaScript, как это вступает в противоречие с заявленной целью создания «идиоматическое» (и, следовательно, предсказуемые) JavaScript.

Ответил 03/10/2012 в 15:27
источник пользователем

голоса
0

Разве это не то, что вы могли бы назвать зарезервированную переменную? Я думаю, вы бы не объявить переменную с именем «это» или «документ» либо.

Пока MS ясно, как к тому, что зарезервированные переменные, я не думаю, что есть большая проблема. Они могли бы, возможно, улучшить компилятор для вывода предупреждений, хотя.

Ответил 03/10/2012 в 15:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more