回調函數應該是大家經常使用到的,以下代碼就是一個回調函數的例子:
ajax(url, () => { // 處理邏輯 })
但是回調函數有一個致命的弱點,就是容易寫出回調地獄(Callback hell)。假設多個請求存在依賴性,你可能就會寫出如下代碼:
ajax(url, () => { // 處理邏輯 ajax(url1, () => { // 處理邏輯 ajax(url2, () => { // 處理邏輯 }) }) })
以上代碼看起來不利於閱讀和維護,當然,你可能會想說解決這個問題還不簡單,把函數分開來寫不就得了
function firstAjax() { ajax(url1, () => { // 處理邏輯 secondAjax() }) } function secondAjax() { ajax(url2, () => { // 處理邏輯 }) } ajax(url, () => { // 處理邏輯 firstAjax() })
以上的代碼雖然看上去利於閱讀了,但是還是沒有解決根本問題。
回調地獄的根本問題就是:
- 嵌套函數存在耦合性,一旦有所改動,就會牽一發而動全身
- 嵌套函數一多,就很難處理錯誤
當然,回調函數還存在着別的幾個缺點,比如不能使用try catch
捕獲錯誤,不能直接return
。