2017-06-02 90 views
2

我试图实现猫鼬虚拟吸气未访问:过了这个使用箭头功能

UserSchema.virtual('fullName') 
    .get(function() { 
    return `${this.firstName} ${this.lastName}`; 
}) 

我注意到,当我使用ES6箭头的功能,而不是正常匿名函数作为参数传递给该得到的虚拟getter将返回undefined。

我知道箭头函数保留了this的上下文,但正常匿名函数正在使用的this的位置在哪里? 如果通过。绑定或使用call()/ apply()函数,那么它应该无关紧要,如果它是箭头函数或正常(这就是我至少测试过的)。那么,为什么这只与正常的功能,但不是箭头功能?

+0

是的,我知道。 但这个箭头功能不起作用。我输入的那个是有效的。为什么会发生这是我的问题。 –

+0

Gotcha。我的头顶是关于应用到模型实例的,但我想完整的解释会很好。 –

回答

0

正常匿名功能正在使用的thisget()提供。

如果您使用箭头功能,您自己绑定this,这意味着它在您的函数中绑定到this,该函数调用get()

你会看到同样的事情发生,如果你叫

.get((function() { 
    return `${this.firstName} ${this.lastName}`; 
}).bind(this)) 
0

我知道箭头的功能保持这种

他们这样做的背景。这就像使用function() { ... }.bind(this)

但是,正常的匿名函数使用的是哪里?

这取决于how the function is called

这是由get函数内部的一些其他代码完成的,而这些代码目前您并不在考虑之列。

由于功能显然利用了this,这方面重要

如果它是由.bind

过去了......然后你有同样的问题作为箭头的功能。

或使用电话()/适用()函数

...那么它会被称为马上,而当你需要它被称为比。

那么如果是箭头功能或正常

会的问题应该没有关系。往上看。

0

箭头函数对于这个有一个特殊的绑定,它来自它的词法上下文。

如果它是通过绑定或使用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必须解析为在词法封闭环境中的绑定。

如果箭头功能不具有其自己的这个结合然后绑定/电话/应用/等。对其这个绑定没有影响。