过了这个使用箭头功能
我试图实现猫鼬虚拟吸气未访问:过了这个使用箭头功能
UserSchema.virtual('fullName')
.get(function() {
return `${this.firstName} ${this.lastName}`;
})
我注意到,当我使用ES6箭头的功能,而不是正常匿名函数作为参数传递给该得到的虚拟getter将返回undefined。
我知道箭头函数保留了this
的上下文,但正常匿名函数正在使用的this
的位置在哪里? 如果通过。绑定或使用call()/ apply()函数,那么它应该无关紧要,如果它是箭头函数或正常(这就是我至少测试过的)。那么,为什么这只与正常的功能,但不是箭头功能?
正常匿名功能正在使用的this
由get()
提供。
如果您使用箭头功能,您自己绑定this
,这意味着它在您的函数中绑定到this
,该函数调用get()
。
你会看到同样的事情发生,如果你叫
.get((function() {
return `${this.firstName} ${this.lastName}`;
}).bind(this))
我知道箭头的功能保持这种
他们这样做的背景。这就像使用function() { ... }.bind(this)
。
但是,正常的匿名函数使用的是哪里?
这取决于how the function is called。
这是由get
函数内部的一些其他代码完成的,而这些代码目前您并不在考虑之列。
由于功能显然利用了this
,这方面重要。
如果它是由.bind
过去了......然后你有同样的问题作为箭头的功能。
或使用电话()/适用()函数
...那么它会被称为马上,而当你需要它被称为比。
那么如果是箭头功能或正常
会的问题应该没有关系。往上看。
箭头函数对于这个有一个特殊的绑定,它来自它的词法上下文。
如果它是通过绑定或使用call()/ apply()函数传递的,那么不管它是箭头函数还是正常的(这就是我至少测试过的)。
我测试了它自己和箭头功能优先于call
:
function f() { var f =() => console.log(this.a); f.call({a: 2});}
f.call({a: 3})
> 3
这种行为背后可能可以从这个引自spec可以理解的逻辑:
的ArrowFunction没有为参数定义本地绑定,超级,这个或new.target。任何对参数的引用,超级,此或arrowFunction内的new.target必须解析为在词法封闭环境中的绑定。
如果箭头功能不具有其自己的这个结合然后绑定/电话/应用/等。对其这个绑定没有影响。
是的,我知道。 但这个箭头功能不起作用。我输入的那个是有效的。为什么会发生这是我的问题。 –
Gotcha。我的头顶是关于应用到模型实例的,但我想完整的解释会很好。 –