ES6 箭头函数正在改变 Meteor.publish 中 this 的范围 [重复]
Posted
技术标签:
【中文标题】ES6 箭头函数正在改变 Meteor.publish 中 this 的范围 [重复]【英文标题】:ES6 Arrow function is changing the scope of this in Meteor.publish [duplicate] 【发布时间】:2016-01-08 12:01:56 【问题描述】:所以我开始在 Meteor
中使用 ES6,但显然如果你尝试使用带有箭头函数的 Meteor.publish
语法,this.userId
是未定义的,而如果你将它与常规 function()
一起使用 this.userId
完美运行,我假设是一种转译器进程,它为userId
分配了一个不同的 this,但这只是一个猜测,有人知道到底发生了什么吗?
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
);
);
【问题讨论】:
来自 MDN:"与函数表达式相比,箭头函数表达式(也称为胖箭头函数)的语法更短,并且在词法上绑定了this
值 .' developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
@FelixKling 这是一个重复的问题?
它解释了箭头函数中的this
是如何工作的。
@FelixKling 箭头函数在 ES6 的上下文中是特定的,虽然我理解你的观点,但我认为答案不够广泛,无法从 Meteor 的角度理解这个概念,恕我直言,你应该重新评估你的决定。跨度>
【参考方案1】:
这不是转译错误,它是箭头函数的feature。箭头函数自动将函数体的上下文设置为它在此处创建的上下文,在本例中为Meteor.publish
的回调。这可以防止 Meteor 重新绑定侦听器函数的上下文。
来自流星publish docs:
在函数内部,这是发布处理程序对象
如果你想让事情正常工作,你需要使用“老派”函数语法来允许 Meteor 正确设置上下文。
【讨论】:
这叫“箭头函数”,而不是“胖箭头函数”。 你是完全正确的 :) 尽管胖箭背后有很强的口语分量。我会更新的!谢谢 "一个箭头函数表达式(也称为胖箭头函数)..." -MDN以上是关于ES6 箭头函数正在改变 Meteor.publish 中 this 的范围 [重复]的主要内容,如果未能解决你的问题,请参考以下文章