compose 函數實現


總結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
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM