我有这段打字稿代码:
constructor($triggerHref: JQuery) {
// stuff...
var _this = this;
$(document).on("click",$triggerHref.selector,e=>{
e.preventDefault();
var target = $(e.srcElement).attr("data-pcc-sort-trigger");
if (target == _this.active)
_this.load(target, !_this.isDescending);
else _this.load(target, false);
});
}
如果我删除var _this = this;
行并在事件处理程序中使用this
,则生成的js代码看起来相当相似(无论如何都会生成_this),但由于某种原因{{1} }和this.active
未定义。
我对TS的范围的理解是this.load()
方法保持()=>{}
与父母的关系,并且只有this
方法像通常的JS方法一样工作。
那为什么这个不适合我?
答案 0 :(得分:1)
正如您已经注意到的,lambda函数在定义lambda函数时捕获this
。这可能导致更糟糕的结果(var _this = this
周围有few bugs},尽管其中大部分似乎都是固定的。
整个语言构造似乎是为了欺骗JavaScript范围(this
是调用该函数的对象。)
至于你解释的怪异(this.active和_this.active表现不同),问题的范围内没有解释。
生成的JavaScript(如您所述)应该(几乎)相同。除了编写var _this = this;
导致_this
在同一范围内定义不止一次并破坏javascript有效性之外。这是TypeScript lambdas的一个问题。永远不要在TS中定义_this
,因为它是为某些目的而保留的(如果它是免费的,则不进行检查)。
TypeScript没有神奇之处。执行的是它生成的JavaScript。检查是否有东西覆盖_this
在同一范围内(由于var _this
的范围是构造函数的范围,因此很容易发现)var
隐藏具有相同名称的变量来自外部范围,因此它应该在构造函数内部。)
我现在避免在TypeScript中使用lambda表达式。使用简单的匿名函数,不需要您重构任何代码。将this
保存到其他变量可能会被视为丑陋,但您可以使用$.proxy()来解决此问题。这样你甚至可以写一个正则表达式替换来将你的lambda更改为$ .proxy()。现在。
总而言之,我需要调试生成的JS以发现错误,因为您的代码应该在语法上很好。在我看来,TypeScript编译器需要对此进行一些重新思考(我希望一些TS爱好者会有所不同并教会我如何正确完成,因为我不是TS,相反)。
我非常确定@RyanCavanaugh能够准备更好的答案。
答案 1 :(得分:0)
lambda表达式生成一个函数表达式,因此相同的范围规则将lambda表达式应用为函数表达式。
示例:
var x = e => {};
生成此Javascript代码:
var x = function (e) {
};
击> <击> 撞击>