非常人为的例子,但假设我们在类函数的某个地方创建了一个变量_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清楚保留变量是什么,我认为就没有大问题。不过,他们也许可以改进编译器以输出警告。