我正在尝试实现mongoose虚拟getter:
UserSchema.virtual('fullName')
.get(function () {
return `${this.firstName} ${this.lastName}`;
})
我注意到当我使用es6箭头函数而不是普通的匿名函数作为参数时,获取虚拟getter会返回undefined。
我知道箭头函数保留了this
的上下文,但是普通匿名函数正在使用的this
在哪里?
如果它是由 .bind 传递或使用调用()/ apply()函数那么它不应该是箭头函数或正常(&# 39;我至少测试过的东西)。那么为什么这只适用于普通函数而不是箭头函数?
答案 0 :(得分:0)
正常匿名函数正在使用的this
由get()
提供。
如果你使用箭头功能,你自己绑定this
,这意味着它绑定到调用this
的函数中的get()
。
如果你打电话
,你会看到同样的事情发生.get((function() {
return `${this.firstName} ${this.lastName}`;
}).bind(this))
答案 1 :(得分:0)
我知道箭头函数会保留此
的上下文
他们这样做。这就像使用function () { ... }.bind(this)
。
但是普通的匿名函数在哪里使用?
这取决于how the function is called。
这是由您当前正在查看的get
函数深处的其他一些代码完成的。
由于该功能明确地使用了this
,因此该上下文很重要。
如果它是由.bind传递的
...然后你遇到与箭头功能相同的问题。
或使用call()/ apply()函数
...然后会立即调用它,而不是在需要调用它时。
然后,如果它是箭头功能或正常
则不重要
这很重要。见上文。
答案 2 :(得分:0)
箭头功能对 this 有一个特殊的绑定,它来自词汇上下文。
如果它是通过.bind传递或使用call()/ apply()函数那么它是无论是箭头函数还是正常(这是我至少测试过的)。
我自己测试过,箭头功能优先于call
:
function f () { var f = () => console.log(this.a); f.call({a: 2});}
f.call({a: 3})
> 3
这种行为背后的逻辑可能可以从spec:
的引用中理解ArrowFunction不为参数,super, this 或new.target定义本地绑定。对ArrowFunction中的参数,super, this 或new.target的任何引用都必须解析为词汇封闭环境中的绑定。
如果箭头功能没有自己的这个的绑定,那么绑定/调用/应用/等。对此绑定没有影响。