Javascript 已传递此消息,但未使用箭头函数访问
我试图实现mongoose虚拟getter: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
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对它的这个绑定没有影响。是的,我知道。但是这个箭头功能不起作用。我打的那个是有效的。我的问题是为什么会这样,明白了。我脑子里想的是如何应用到模型实例,但我想完整的解释会很好。