使用TypeScript v1.7.5,this
的上下文似乎变得混乱,或者可能没有正确转换。或者我错过了什么。在箭头函数内部,this
正在改变,当我预期它仍然引用与函数外部相同的this
时。我调试了这种情况,结果在下面的评论中说明。
来源TS
// Debug: "this" is an instance of the class -- good.
FS.exists(dbPath, (exists: boolean) => {
// Debug: "this" is an instance of the global object -- not good.
...
});
结果JS(ES5)
FS.exists(dbPath, function (exists) {
...
});
我期待生成的JS绑定回调,如下所示:
FS.exists(dbPath, function (exists) {
...
}.bind(this));
我需要在回调中保留this
的值,因此我在整个代码中都使用了箭头函数。但我很困惑为什么这似乎没有正常工作。
注意
当且仅当我特意尝试在箭头函数中使用this
时,TypeScript才会创建此解决方法:
var _this = this;
FS.exists(dbPath, function (exists) {
var _x = this;
});
好的,很好,但是使用bind会不会更好?这仍然没有解决我从箭头函数中调用函数的问题。那些函数调用将失去this
的上下文,这不是合适的行为。
答案 0 :(得分:1)
这看起来像是Typescript编译器所需的行为。
ES6胖箭头功能=>
实际上并非this
。相反,this
实际上落到了较高的范围。与arguments
相同,你不能在胖箭头函数中使用它,因为它们会落到上面的范围内。
因此,根据规范,所有时间的绑定都是不正确的行为。如果您没有使用它,则始终从函数内的父作用域引用this
将是一种不受欢迎的行为。这看起来像是TypeScript编译器的正确优化。