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.

据我所知,TypeScript 规范中没有指定这种行为。

他们为什么要冲突?编译器不能检测我是否创建了一个名为_this并将自动生成的变量命名为别的变量,比如_this2防止我的变量和编译器生成的变量相互践踏?

4

2 回答 2

7

编译器会自动创建_this一个引用,this以方便使用 lambda 语法创建的闭包。我很确定我在某处的 TypeScript 规范中读到了这个,但我同意编译器在这种情况下应该发出错误。

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

于 2012-10-03T14:27:00.853 回答
0

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

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

于 2012-10-03T14:27:29.857 回答