Javascript TS/JS箭头函数更改“this”的值?

Javascript TS/JS箭头函数更改“this”的值?,javascript,node.js,typescript,arrow-functions,Javascript,Node.js,Typescript,Arrow Functions,使用TypeScript v1.7.5,此的上下文似乎变得混乱,或者可能传输不正确。或者我错过了什么。在arrow函数内部,此正在更改,而我希望它仍然引用与函数外部相同的此。我已经调试了情况,结果显示在下面的评论中 源TS // Debug: "this" is an instance of the class -- good. FS.exists(dbPath, (exists: boolean) => { // Debug: "this" is an instance of t

使用TypeScript v1.7.5,此的上下文似乎变得混乱,或者可能传输不正确。或者我错过了什么。在arrow函数内部,
正在更改,而我希望它仍然引用与函数外部相同的
。我已经调试了情况,结果显示在下面的评论中

源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)

我希望生成的JS绑定回调,如下所示:

FS.exists(dbPath, function (exists) {
    ...
}.bind(this));
我需要在回调中保留
this
的值,因此我在整个代码中使用箭头函数。但我不明白为什么这似乎不能正常工作

注意

如果且仅当我特别尝试在arrow函数中使用
this
,则TypeScript会创建此解决方法:

var _this = this;

FS.exists(dbPath, function (exists) {
    var _x = this;
});

好吧,好吧,但是用bind不是更好吗?这仍然不能解决我从arrow函数中调用函数的问题。这些函数调用将丢失此的上下文,这不是适当的行为。

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

ES6胖箭头函数实际上不绑定此。相反,
这个
实际上属于更高的范围。与
参数相同,您不能在胖箭头函数中使用它,因为它们将进入上限范围


因此,根据规范,始终绑定都是不正确的行为。如果不使用函数,则始终从父作用域中引用
将是不希望的行为。这看起来像是TypeScript编译器的正确优化。

很有趣。我已经把我的问题缩小了一些,现在明白发生了什么。但这让我感到困惑;你能提供到你的消息来源的链接吗?@JoshM。什么的来源?对规范的引用,或者关于箭头函数为何以这种方式传输的详细信息?另外,我知道ES6箭头函数不绑定
this
,但它的影响与非箭头函数绑定
this
——它在绑定时会引用
this
;与箭头函数将引用的
相同<代码>以词汇方式绑定this值(不绑定它自己的this、arguments、super或new.target)
您确定了传输的代码行为不正确的情况吗?除非需要,否则transpiler不会创建此
变量的
。我不理解你对这一点的评论,它仍然不能解决我从arrow函数中调用函数的问题。这些函数调用将失去上下文,你能举一个这样的函数调用的例子吗?事实证明,这是我的错,我对TS在传输过程中对箭头函数做了什么感到困惑。最后,我存储了对实例函数的引用,然后在以后从arrow函数中调用它们。然后,这些存储实例假定嵌套的arrow函数的
上下文。因此,我刚刚更新了函数引用以绑定到正确版本的
this
var _this = this;

FS.exists(dbPath, function (exists) {
    var _x = this;
});