在你不知道this指向哪儿的时候, 请慎用 Arrow Function!
自从用上了ES6之后, 但凡见到 function() {}
总要改成 () => {}
, 觉得这样既优雅又美观. 直到今天debug了半天, 终于翻然悔悟, 在心里还不清楚this指向的时候, 请慎用 Arrow Function!
比如Mongoose定义Schema的statics/methods的时候:
XXXSchema.statics.list = () => {
return this.find().exec()
}
乍一看这样并没有错误, 实际上此处的this
并不会指向你认为的对象.
因为 Arrow Function是 Lexical scoping, this指向定义Arrow Function时外围, 而不是运行时的对象
可以看下这篇文章: Do ES6 Arrow Functions Really Solve “this” In JavaScript? 说的很详细
12 回复
ECMAScript 6 入门对箭头函数的使用限制做说明了 箭头函数有几个使用注意点。 (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。 (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。 (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。 (4)不可以使用yield命令,因此箭头函数不能用作Generator函数。