应该创建一个名为_this的变量与此冲突吗?

问题描述:

这是一个非常人为的例子,但让我们假设我们在类函数的某个地方创建了一个变量_this应该创建一个名为_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,以使我的变量和编译器生成的变量不会相互踩踏?

+2

这对我来说似乎是一个非常严重的问题。它应该至少包含在语言规范中。我建议在[TypeScript问题跟踪器](http://typescript.codeplex.com/workitem/list/basic)上发布这个官方回复。 – joshuapoehls

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

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

难道你不会调用保留变量吗?我猜你不会声明一个名为“this”或“document”的变量。

只要MS清楚保留变量是什么,我不认为有一个主要问题。他们或许可以改进编译器来输出警告。

+1

据我所知,它没有记录为保留变量。它不输出任何警告或错误。 –

+0

同样,JavaScript中没有任何东西不让你声明一个名为'document'的变量。但是,在浏览器环境中,“document”将作为主变量存在,您将无法重新分配它。 –