說在前頭
“一切皆物件”不知幾何起已成為一種語言的楷模,一種對寫法規範的標準,但其實各種語言依然有他們自身的精彩與美麗,更何況當今多數外掛的底層,演算法仍無法避免程式導向的書寫(我們無法否認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)
})()
複製程式碼
這樣柯里化的呼叫就優化完成了。不光是把函式抽離,呼叫也沒有難看的層層巢狀了,作用域也可從回撥上進行資料共享,也可分散式傳參,最後統一處理。真正意義上做到了即拿即用。
關於
make:o︻そ╆OVE▅▅▅▆▇◤(清一色天空)
blog:http://blog.csdn.net/mcky_love
掘金:https://juejin.im/user/59fbe6c66fb9a045186a159a/posts
結束語
以上針對的是同步過程處理,如要非同步,還是建議鏈式呼叫之類的了,用callback處理柯里化,程式碼結構上還是相當頭疼的。
以下是非同步巢狀解決方案: