2017-06-02 83 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必須解析爲在詞法封閉環境中的綁定。

如果箭頭功能不具有其自己的這個結合然後綁定/電話/應用/等。對其這個綁定沒有影響。