这是一个非常做作的例子,但让我们假设我们创建一个变量 _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 以方便将通过使用lambda语法创建的闭包。我很确定我在某个地方的TypeScript规范中读到了这一点,但是我同意编译器应该在这种情况下发出错误。

我不喜欢编译器改变它如何发出javascript的想法,因为这与生成"惯用"(因此可预测)javascript的既定目标相冲突。

其他提示

这不就是你所说的保留变量吗?我想你也不会声明一个名为"this"或"document"的变量。

只要MS清楚保留变量是什么,我不认为存在重大问题。不过,他们也许可以改进编译器以输出警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top