4

我有这段 Typescript 代码:

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),但由于某种原因this.active并且this.load()未定义。

我对 TS 的作用域的理解是,()=>{}方法不让this他们的父母知道,只有function(){}方法像通常的 JS 方法一样工作。

那么为什么这个对我不起作用?

4

2 回答 2

1

正如您已经注意到的,lambda 函数this在定义 lambda 函数时捕获。这可能会导致奇怪的结果(周围也有一些 错误var _this = this),尽管其中大部分似乎已修复。

整个语言结构似乎是为了欺骗 JavaScript 作用域(this是调用函数的对象)。

至于您解释的怪异(this.active 和 _this.active 行为不同),问题范围内没有解释。

生成的 JavaScript(如您所说)应该(几乎)相同。除了编写var _this = this;导致_this在同一范围内多次定义和破坏 javascript 有效性之外。这是围绕 TypeScript lambda 的问题。永远不要在 TS 中定义_this,因为它是为某些目的而保留的(并且不检查它是否是免费的)。

TypeScript 没有魔法。执行的是它生成的 JavaScript。检查是否有东西在同一个范围内被覆盖_this(这很容易发现,因为范围var _this是构造函数的范围,也var隐藏了来自外部范围的同名变量,所以它应该在构造函数内)。

我暂时避免在 TypeScript 中使用 lambda 表达式。改用简单的匿名函数,不需要您重构任何代码。保存this到其他变量可能被认为是丑陋的,但是您可以通过使用$.proxy()来解决它。这样你甚至可以编写一个正则表达式替换来将你的 lambdas 更改为 $.proxy()。目前。

所以总而言之,我需要调试生成的 JS 来发现错误,因为你的代码在语法上应该没问题。在我看来,TypeScript 编译器需要围绕这一点重新思考(我希望一些 TS 爱好者会有所不同,并教我如何正确完成它,因为我不反对 TS,相反)。

我很确定@RyanCavanaugh 能够准备一个更好的答案。

于 2013-04-25T07:21:16.127 回答
0

lambda 表达式生成一个函数表达式,因此适用于 lambda 表达式的范围规则与函数表达式相同。

例子:

var x = e => {};

生成这个 Javascript 代码:

var x = function (e) {
};

于 2013-03-08T12:42:11.803 回答