我正在使用MongoDB
中的箭头功能来编写MapReduce作业,我注意到了一些奇怪的行为。
我有一批学生如下:
{ "_id" : ObjectId("58ff3520704bd5539fe9dc7b"), "stud_id" : "x0000003", "name" : "david smith", "class" : "InfMgt", "weekNo" : 2, "attendencesThisWeek" : 4 }
{ "_id" : ObjectId("58ff3520704bd5539fe9dc7c"), "stud_id" : "x0000003", "name" : "david smith", "class" : "InfMgt", "weekNo" : 3, "attendencesThisWeek" : 2 }
{ "_id" : ObjectId("58ff3543704bd5539fe9dc7d"), "stud_id" : "x0000001", "name" : "sean smith", "class" : "edt", "weekNo" : 1, "attendencesThisWeek" : 2 }
{ "_id" : ObjectId("58ff3543704bd5539fe9dc7e"), "stud_id" : "x0000001", "name" : "sean smith", "class" : "edt", "weekNo" : 2, "attendencesThisWeek" : 2 }
...
现在我的任务是写一个MapReduce作业,找出每个学生到这个日期的总体注意力,所以我开始用箭头函数编写我的函数:
地图功能
const mapFunc = () => emit(this.stud_id, this.attendencesThisWeek)
这是不发出任何内容,在线查询后,我发现箭头功能已经定义了this
,这使得它不适合作为地图功能
在箭头函数内,这和参数引用的值 这个和环境中的参数定义了箭头函数 (即箭头功能“外部”)
所以我用“经典”方式重写了我的功能:
const mapFunc2 = function() {emit(this.stud_id, this.attendencesThisWeek)}
(我仍然使用const
确保没有修改此功能或重新分配到mapFunc2
)
减少功能
完成后,我认为reduce函数应该没有问题,因为它没有使用this
关键字。
我错了!
const reduceFunc = (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek)
产生非常有趣的结果:
{ "_id" : "x0000002", "value" : (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek) }
{ "_id" : "x0000003", "value" : (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek) }
从进入相同的堆栈溢出回答我读到了这个:
ES2015区分可调用的函数和函数 这是可构造的。如果函数是可构造的,它可以是 用new调用,即new User()。如果一个函数是可调用的,它可以是 没有新的呼叫(即正常的函数调用)。
通过函数声明/表达式创建的函数都是 可构造和可调用的。箭头函数(和方法)只是 调用。类构造函数只能构造。
我的猜测是MongoDB调用reduce函数的方式使其作为箭头函数不可写,但在这里我需要帮助来理解实际发生的事情。
我将reduce函数再次更改为“classic”版本:
const reduceFunc2 = function(keyStudId, attendences) { return Array.sum(attendences) }
哪个好,但让我想知道为什么箭头功能不可用。
感谢您的阅读,对于那些学习过这种方式的强制性程序员来说,这可能是不重要的,但我想如果多年来一些大学开始教授功能性的第一和箭头功能,例如成为常态,这将是相当奇怪的对于那些必须适应的开发人员(如果不理解为什么事情会这样运作)。
请参阅https://stackoverflow.com/a/34361380/4884034
编辑:
3.2.7
MozJS-38
mozjs