我不确定在TypeScript中处理“ this”作用域的最佳方法。
这是我要转换为TypeScript的代码中常见模式的示例:
class DemonstrateScopingProblems {
private status = "blah";
public run() {
alert(this.status);
}
}
var thisTest = new DemonstrateScopingProblems();
// works as expected, displays "blah":
thisTest.run();
// doesn't work; this is scoped to be the document so this.status is undefined:
$(document).ready(thisTest.run);
现在,我可以将呼叫更改为...
$(document).ready(thisTest.run.bind(thisTest));
...有效 但这有点可怕。这意味着在某些情况下,所有代码都可以编译并正常工作,但是如果我们忘记绑定范围,它将被破坏。
我想要一种在类中执行此操作的方法,这样在使用类时,我们无需担心“ this”的作用域。
有什么建议么?
更新资料
另一种可行的方法是使用粗箭头:
class DemonstrateScopingProblems {
private status = "blah";
public run = () => {
alert(this.status);
}
}
那是有效的方法吗?
您在这里有几个选择,每个选择都有其自身的取舍。不幸的是,没有明显的最佳解决方案,它实际上取决于应用程序。
自动类绑定
如您的问题所示:
this
上下文而不是每个调用站点在调用时创建一个新的闭包更为有效。this
上下文super.
Function.bind
也如图所示:
粗体箭头
在TypeScript中(出于解释原因,此处显示了一些虚拟参数):