TypeScript:那么“这个”范围究竟是什么?

时间:2013-03-08 12:35:04

标签: javascript 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),但由于某种原因{{1} }和this.active未定义。

我对TS的范围的理解是this.load()方法保持()=>{}与父母的关系,并且只有this方法像通常的JS方法一样工作。

那为什么这个不适合我?

2 个答案:

答案 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) {
};

<击>