Javascript TypeScript:那么,确切地说是什么呢;这";范围?

Javascript TypeScript:那么,确切地说是什么呢;这";范围?,javascript,typescript,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-tr

我有一段打字脚本代码:

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 x = function (e) {
};
如果我删除
var\u this=this行,只需在事件处理程序中使用
this
,生成的js代码看起来基本相同(它生成了_this),但由于某些原因,
this.active
this.load()
未定义

我对TS作用域的理解是
()=>{}
方法将
这个
从它们的父母那里保留下来,并且只有
函数(){}
方法像通常的JS方法一样工作

那么为什么这个表达式对我不起作用呢?

lambda表达式生成函数表达式,因此作用域的相同规则适用于lambda表达式作为函数表达式

例如:

var x = e => {};
生成此Javascript代码:

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 x = function (e) {
};

正如您已经注意到的,lambda函数在定义lambda函数时捕获
。这可能会导致wierd结果(也有一个大约
var\u This=This
),尽管其中大部分似乎是固定的

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

至于你解释的奇怪之处(this.active和_this.active行为不同),在问题的范围内没有解释

生成的JavaScript(如您所述)应该(几乎)相同。除了写
var\u this=this导致在同一范围内多次定义此
并破坏javascript有效性。这是一个关于类型脚本lambdas的问题。切勿在TS中定义此
,因为它是为某些目的保留的(如果是免费的,则不检查)

打字脚本中没有魔力。执行的是它生成的JavaScript。检查是否有内容覆盖了同一范围内的
\u this
(这很容易发现,因为
var\u this
的范围是构造函数函数的范围,而且
var
隐藏了来自外部范围的同名变量,因此它应该在构造函数内部)

我现在避免在TypeScript中使用lambda表达式。相反,使用简单的匿名函数不需要重新构造任何代码。将此
保存到其他变量可以被认为是丑陋的是,但您可以使用例如。这样,您甚至可以编写一个正则表达式替换,将lambda更改为$.proxy()。现在

总而言之,我需要调试生成的JS以发现错误,因为您的代码在语法上应该很好。在我看来,TypeScript编译器需要对此进行一些反思(我希望一些TS爱好者会有所不同,并教我如何正确地完成它,因为我不是agains TS,相反)


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

我想当你在TypeScript中使用箭头符号时,它的
范围也被限定在你创建它的上下文中。我是不是在想一个不同的符号来做这个呢?@Chad:事实上,我不得不收回这些。在对象内部使用时,lambda表达式也会导致创建一个
\u this
变量,并且对
this
的所有引用都将更改为
\u this
。我不知道为什么这在你的情况下不起作用。你的理解是正确的,当我尝试这个时,生成的代码对我来说是相同的。您看到了什么不同?@JohnnyHK:在调试器中,
这个
被解析为
$triggerHref
中包装的对象,然后代码存在于
(target==undefined)
行中,而不会引发异常。通过手动将
这个
放在那里,一切都按预期进行。@JcFx:这真的很重要吗?你能发布一个更完整的例子吗?@RyanCavanaugh:我会在以后的空闲时间提供一个(逐步复制):)