我明白,兩者都是返回函數的函數。簡而言之,thunk和Higher Order Function之間有什麼區別?
到目前爲止,我的經驗使用它們來返回函數,而不僅僅是操作對象,以便我可以使用Redux
中的異步請求。
閉包是一個高階函數(HOF)的實現,以便爲私有變量創建一個新的作用域......對嗎? HOF的其他例子包括map
,reduce
和filter
。
還有其他的東西明確定義了兩者之間的區別嗎?
謝謝。
我明白,兩者都是返回函數的函數。簡而言之,thunk和Higher Order Function之間有什麼區別?
到目前爲止,我的經驗使用它們來返回函數,而不僅僅是操作對象,以便我可以使用Redux
中的異步請求。
閉包是一個高階函數(HOF)的實現,以便爲私有變量創建一個新的作用域......對嗎? HOF的其他例子包括map
,reduce
和filter
。
還有其他的東西明確定義了兩者之間的區別嗎?
謝謝。
我明白無論是返回功能
你的理解功能稍有不正確
我的經驗,到目前爲止用的thunk一直在使用他們返回的功能,而不是僅僅採取行動的對象,這樣我可以在終極版異步請求工作。
Thunks(和高階函數)與任何特定庫(React,Redux)或任何特定控制流(sync,async)都沒有內在關聯。 Thunk只是一個無用函數 - 它們有各種常見用例,但最常用於延遲特定計算的評估。
閉包是一個高階函數(HOF)的實現,以便爲私有變量創建一個新的作用域......對嗎? HOF的其他例子包括map,reduce和filter。
A closure不一定是高階函數的實現。 function
關鍵字(和=>
箭頭函數語法)確實創建了一個確實具有新(詞法)範圍的閉包。
有沒有其他的東西明確定義了兩者之間的區別?
是的。他們怎麼是一樣的:
如何不同:
也許最關鍵的區別:
Thunks是函數包裝表達式,以便延遲他們的評價。
這個延遲是在Redux thunk中實現的,當一個動作被調用時它返回一個函數。隨後可以調用返回的這個函數。
以下是thunk動作的示例。
function incrementAsync() {
// the below function is called by Redux Thunk middleware below.
return dispatch => {
setTimeout(() => {
// Yay! Can invoke sync or async actions with `dispatch`
dispatch(increment());
}, 1000);
};
高階函數只是一個函數,它要麼返回一個函數,要麼將一個函數作爲其參數之一。因爲這個函數返回另一個函數,它將dispatch作爲參數,這是一個高階函數的例子。
從終極版的代碼咚中間件類似於此
function createThunkMiddleware() {
return store => next => action => {
if (typeof action === 'function') {
// since action is a function it is a thunk action creator
// so call it with store methods
return action(store.dispatch, store.getState);
}
// action is not a function so redux thunk ignores it
return next(action);
};
}
只要我們的thunk行動的創建者被稱爲它通過中間件鏈發送動作功能。當它到達我們的thunk中間件時,這個動作被識別爲一個函數,因此再次用store的dispatch和getState方法調用。
由於第二次函數調用,我們現在處於我們的thunk動作創建者返回函數的範圍內。這意味着我們現在可以執行異步邏輯並仍然可以訪問商店的getState和調度方法。這就是爲什麼我們的thunk動作創作者可以被視爲一個thunk表達。通過使用更高階的函數,我們可以訪問,但推遲商店的dispatch或getState方法的使用未來的時間。如下所示,遞增操作在一秒延遲後被調用。
function incrementAsync() {
// the below function is called by Redux Thunk middleware below.
return dispatch => {
setTimeout(() => {
// Yay! Can invoke sync or async actions with `dispatch`
dispatch(increment());
}, 1000);
};
謝謝@therewillbecode。說所有的thunk是高階函數,但並不是所有的高階函數都是thunk? – bloppit
@bloppit是的,thunk只是高階函數的一個例子,並且與其他函數創建的回調函數差不多。 –
高階函數是將另一個函數作爲參數的函數。它們返回的內容無關緊要。一個thunk根本不需要任何參數。它只是推遲表達式的評估,並在調用時產生此表達式的結果。 – ftor