2016-05-09 151 views
2

現在在我的幫助是利用function()MeteorJS - 功能之間的差異()和()=>

updateCVId: function() { 
    return this._id; //return the real id 

} 

它的工作,但如果我用()=>

updateCVId:()=> { 
    return this._id; //return undefined 
} 

然後this._id是未定義。

這同樣適用於事件:

'click .foo': function(evt, tmp) { 
    console.log(this._id); //log the real id 
} 

'click .foo': (evt, tmp)=> { 
    console.log(this._id); //log undefined 
} 

有人能告訴我,如果我用()=>,如何獲得這些數據?

謝謝你們。

+0

在箭頭函數中,* this *被分配爲創建函數的執行上下文的* this *。在函數聲明或表達式中,它由調用(或* bind *)設置,因此可能是不同的對象。 – RobG

+0

好的,那麼如何獲取箭頭函數中的數據,就像我在正常函數中使用它一樣? –

+0

使用函數聲明或表達式(第一個示例),請參閱[* ES6箭頭函數始終關閉「this」?*](http://stackoverflow.com/questions/35813344/do-es6-arrow-functions-常閉-過這一點)。 – RobG

回答

4

箭頭功能=>被設計爲自動綁定來自詞彙範圍的上下文this。在你的情況this是未定義的,因爲它運行在'strict mode'

解決您的問題,您可以:

1)使用普通的功能,像你一樣已經:

var actions = { 
    //... 
    updateCVId: function() { 
     return this._id; //return the real id 
    } 
    //... 
}; 

2)使用ES6速記功能符號:

var actions = { 
    //... 
    updateCVId() { 
     return this._id; //return the real id 
    } 
    //... 
}; 

function() {}=>之間的區別在於this上下文以及調用如何影響this

function() {}this由函數的調用方式決定。如果將其作爲對象的方法調用,則this將成爲對象本身:actions.updateCVId()
我稱之爲soft linked this

在箭頭函數的情況下=>this自動綁定到定義函數的詞法作用域的this。在你的例子中,這是一個undefined,這是'strict mode'的默認情況。
不管以後如何調用箭頭函數,它將有this作爲undefined
我稱之爲hard linked this

你可以在this article找到更多關於this關鍵字的資料。

相關問題