通过使用箭头功能无法访问此项

时间:2017-06-02 13:21:18

标签: javascript mongoose

我正在尝试实现mongoose虚拟getter:

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

我注意到当我使用es6箭头函数而不是普通的匿名函数作为参数时,获取虚拟getter会返回undefined。

我知道箭头函数保留了this的上下文,但是普通匿名函数正在使用的this在哪里? 如果它是由 .bind 传递或使用调用()/ apply()函数那么它不应该是箭头函数或正常(&# 39;我至少测试过的东西)。那么为什么这只适用于普通函数而不是箭头函数?

3 个答案:

答案 0 :(得分:0)

正常匿名函数正在使用的thisget()提供。

如果你使用箭头功能,你自己绑定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的任何引用都必须解析为词汇封闭环境中的绑定。

如果箭头功能没有自己的这个的绑定,那么绑定/调用/应用/等。对绑定没有影响。