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 正确设置上下文。
所以我开始在 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 正确设置上下文。