ES6 箭头函数正在 Meteor.publish 中改变 this 的范围

ES6 Arrow function is changing the scope of this in Meteor.publish

所以我开始在 Meteor 中使用 ES6,但显然如果你尝试使用带有箭头函数的 Meteor.publish 语法,this.userId 是未定义的,而如果你将它与常规 function(){} this.userId 完美运行,我假设是一种将不同的 this 分配给 userId 的转译器进程,但这只是一个猜测,有人知道到底发生了什么吗?

Meteor.startup(function() {
    Meteor.publish("Activities", function() { //with function
        console.log(this.userId); //TS8vTE3z56LLcaCb5
    });
});

Meteor.startup(function() {
    Meteor.publish("Activities", ()=> { //with arrow function
        console.log(this.userId); //undefined
    });
});

这不是转译错误,这是箭头函数的 feature。箭头函数自动将函数体的上下文设置为它创建时的上下文,在本例中为 Meteor.publish 的回调。这可以防止 Meteor 重新绑定您的侦听器函数的上下文。

来自流星publish docs:

Inside the function, this is the publish handler object

如果你想让事情正常工作,你需要使用 "old-school" 函数语法来让 Meteor 正确设置上下文。