TS / JS箭头函数改变了'this`的值?

时间:2016-01-24 03:26:43

标签: javascript node.js typescript arrow-functions

使用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的上下文,这不是合适的行为。

1 个答案:

答案 0 :(得分:1)

这看起来像是Typescript编译器所需的行为。

ES6胖箭头功能=> 实际上并非this 。相反,this实际上落到了较高的范围。与arguments相同,你不能在胖箭头函数中使用它,因为它们会落到上面的范围内。

因此,根据规范,所有时间的绑定都是不正确的行为。如果您没有使用它,则始终从函数内的父作用域引用this将是一种不受欢迎的行为。这看起来像是TypeScript编译器的正确优化。