總結componse函數實現過程
大致特點
- 參數均為函數, 返回值也是函數
- 第一函數接受參數, 其他函數接受的上一個函數的返回值
- 第一個函數的參數是多元的, 其他函數的一元的
- 自右向左執行
簡單實現
第一步: 記錄我們傳入所有函數的個數
var compose = function (...args) {
var len = args.length // 記錄我們傳入所有函數的個數
return function f1() {
//
}
}
第二步: 利用游標記錄該運行的函數
var compose = function (...fns) {
var len = fns.length // 記錄我們傳入所有函數的個數
var index = len - 1 // 游標記錄函數執行情況, 也作為我們運行fns中的中函數的索引
var reslut // 結果, 每次函數執行完成后, 向下傳遞
return function f1(...arg1) {
reslut = fns[index].apply(this, arg1)
--index
return f1.call(null, reslut)
}
}
第三步: 完成代碼
var compose = function (...fns) {
var len = fns.length // 記錄我們傳入所有函數的個數
var index = len - 1 // 游標記錄函數執行情況, 也作為我們運行fns中的中函數的索引
var reslut // 結果, 每次函數執行完成后, 向下傳遞
return function f1(...arg1) {
reslut = fns[index].apply(this, arg1)
if (index <= 0) {
index = len - 1 // 再看這篇文章的時候, 不清楚這里處理index的作用
return reslut
} else {
--index
return f1.call(null, reslut)
}
}
}
loadsh實現
直接實現
使用while迭代完成
var flow = function (fns) {
var len = fns.length
// 檢查所有參數是否為函數
var index = len
while (index--) {
if (typeof fns[index] !== 'function') {
throw new TypeError('Expected a function')
}
}
return function (...args) {
var index = 0
// 傳入數組為空, 錯誤的話, 執行后面的啊, 傻瓜, 竟然卡了這么久, 也真是夠了
var reslut = len ? fns[index].apply(this, args) : args[0]
while (++index < len) {
reslut = fns[index].call(this, reslut)
}
return reslut
}
}