【庫】利用ES6 預設傳參Default Parameters改善柯里化應用

清一色天空發表於2018-07-18

說在前頭

“一切皆物件”不知幾何起已成為一種語言的楷模,一種對寫法規範的標準,但其實各種語言依然有他們自身的精彩與美麗,更何況當今多數外掛的底層,演算法仍無法避免程式導向的書寫(我們無法否認if else給我們帶來的便捷),所以在物件導向化的今天,我仍要聊一聊過程化的極致以及寫法的優化

TIPS:偏函式與柯里化的區別就不再概述


一、以往的柯里化執行

1、集中式處理

const test = a => {
  a++
  return b => {
    b++
    return c => {
      c++
      return call => call(a, b, c)
    }
  }
}
test(5)(6)(7)((a, b, c) => {
  console.log(a + b + c) // 統一結果處理
})
// 21
複製程式碼

在同步運算的呼叫中進行函式處理,達到作用域層層共享的結果,除了巢狀的瑕疵,函式的執行過程還是相當別緻的,這兒可以用eval以及typeof ‘function’進行一個遞迴判斷執行,避免層層巢狀,因為有其他更優的寫法,我這兒就懶得寫了。


2、分步式處理

const test = a => {
  a++
  return b => {
    b++
    return c => {
      c++
      return a + b + c // 統一結果處理
    }
  }
}
let call1 = test(5)
let call2 = call1(6)
let call3 = call2(7)
console.log(call3)
// 21
複製程式碼

這兒的優勢在於,將函式傳參部分進行return回撥,從而外部控制函式的next執行,函式的獨立性有一定的降低,便於隨時的呼叫操縱,但業務耦合性有一定增高,需取捨。


二、如今的柯里化執行

ES6 出了一個Default Parameters,便於函式的預設傳參,例如:

const test = (x = 1) => {
	console.log(x)
}
test()
// 1
test(2)
// 2
複製程式碼

然而該預設的引數竟可以支援函式的執行,那我們便可對其進行一些腦洞了。

廢話不多說,直接上程式碼

const call1 = obj => { /* 函式抽離 */
  console.log('執行call1')
  return obj.val + 1
}
const call2 = obj => {
  console.log('執行call2')
  return obj.val + 2
}
const call3 = obj => {
  console.log('執行call3')
  return obj.val + 3
}
/* 這裡還可以定義 call4, call5, call6...... */
/* 要用的即拿 */
((a = call1({
  val: 5 // 初次傳參
}), b = call2({
  val: a // 這邊也一樣可以進行分散式傳參,不必傳上一個作用域的值
}), c = call3({
  val: b
})) => {
  console.log('統一結果處理:', a, b, c)
})()
複製程式碼

柯里化ES6Default Parameters預設傳參

這樣柯里化的呼叫就優化完成了。不光是把函式抽離,呼叫也沒有難看的層層巢狀了,作用域也可從回撥上進行資料共享,也可分散式傳參,最後統一處理。真正意義上做到了即拿即用。


關於

make:o︻そ╆OVE▅▅▅▆▇◤(清一色天空)

blog:http://blog.csdn.net/mcky_love

掘金:https://juejin.im/user/59fbe6c66fb9a045186a159a/posts


結束語

以上針對的是同步過程處理,如要非同步,還是建議鏈式呼叫之類的了,用callback處理柯里化,程式碼結構上還是相當頭疼的。

以下是非同步巢狀解決方案:

【庫】Promise的簡便實現,15行程式碼優雅解決非同步巢狀

【庫】Generator:8行程式碼優雅解決非同步巢狀

相關文章