Javascript 已传递此消息,但未使用箭头函数访问

Javascript 已传递此消息,但未使用箭头函数访问,javascript,mongoose,Javascript,Mongoose,我试图实现mongoose虚拟getter: UserSchema.virtual('fullName') .get(function () { return `${this.firstName} ${this.lastName}`; }) 我注意到,当我使用es6 arrow函数而不是普通的匿名函数作为get的参数时,virtual getter将返回undefined 我知道arrow函数保存了this的上下文,但是普通匿名函数使用的this在哪里?。 如果它是通过.b

我试图实现mongoose虚拟getter:

   UserSchema.virtual('fullName')
   .get(function () {
    return `${this.firstName} ${this.lastName}`;
})
我注意到,当我使用es6 arrow函数而不是普通的匿名函数作为get的参数时,virtual getter将返回undefined

我知道arrow函数保存了
this
的上下文,但是普通匿名函数使用的
this
在哪里?。
如果它是通过.bind或使用call()/apply()函数传递的,那么不管它是arrow函数还是normal函数(这是我至少测试过的)。那么,为什么这只适用于普通函数而不适用于箭头函数呢?

普通匿名函数使用的
get()
提供

如果使用arrow函数,则您自己绑定了
this
,这意味着它绑定到调用
get()
的函数中的
this

如果你打电话,你会看到同样的事情发生

.get((function() {
    return `${this.firstName} ${this.lastName}`;
}).bind(this))
我知道arrow函数保留了这个上下文

是的。这就像使用
函数(){…}.bind(this)

但是,正常的匿名函数使用的是什么呢

这要看情况而定

这是由
get
函数中的其他一些代码完成的,您目前没有看到这些代码

由于函数明确使用了
这个
,因此上下文很重要

如果它被路过。绑定

…那么你会遇到与箭头功能相同的问题

或者使用call()/apply()函数

…然后会立即调用,而不是在需要调用时调用

那么它是箭头功能还是正常就不重要了


这很重要。参见上文。

Arrow函数有一个特殊的绑定,该绑定来自其词法上下文

如果它是通过.bind或使用call()/apply()函数传递的,那么不管它是arrow函数还是normal函数(这是我至少测试过的)

我自己测试过,箭头函数优先于
调用

function f () { var f = () => console.log(this.a); f.call({a: 2});}
f.call({a: 3})
> 3
这种行为背后的逻辑可能可以从以下引用中理解:

arrow函数不为参数、super、this或new.target定义本地绑定。Arrow函数中对参数super、this或new.target的任何引用都必须解析为词汇封闭环境中的绑定


如果arrow函数没有自己的绑定来绑定这个,那么bind/call/apply/etc对它的这个绑定没有影响。

是的,我知道。但是这个箭头功能不起作用。我打的那个是有效的。我的问题是为什么会这样,明白了。我脑子里想的是如何应用到模型实例,但我想完整的解释会很好。