应该创建一个名为_this的变量吗?

时间:2012-10-03 14:08:45

标签: typescript name-conflict

这是一个非常人为的例子,但我们假设我们在类函数的某处创建了一个变量_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,以保持我的变量和编译器生成的变量不会相互踩踏? / p>

2 个答案:

答案 0 :(得分:7)

编译器将自动创建_this作为对this的引用,以促进使用lambda语法创建的闭包。我很确定我在某处的TypeScript规范中读过这个,但我同意编译器在这种情况下会发出错误。

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

答案 1 :(得分:0)

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

只要MS明确保留变量是什么,我认为不存在重大问题。他们可能会改进编译器以输出警告。