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 的范围 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ES6 箭头函数

ES6学习--箭头函数

ES6 箭头函数

深入理解ES6箭头函数中的this

ES6 一些新特性的总结

ES6相关知识