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:我会在以后的空闲时间提供一个(逐步复制):)