JavaScript函數(shù)式編程

JavaScript函數(shù)arguments

arguments 是一個 對應(yīng)于 傳遞給函數(shù)的參數(shù) 的 類數(shù)組(array-like)對象。

array-like意味著它不是一個數(shù)組類型,而是一個對象類型:

  • 擁有數(shù)組的一些特性,比如說length,比如可以通過index索引來訪問;
  • 沒有數(shù)組的一些方法,比如forEach、map等;

arguments轉(zhuǎn)數(shù)組

  // 1.自己遍歷
  var newArr = []
  for (var i = 0; i < arguments.length; i++) {
    newArr.push(arguments[i] * 10)
  }
  console.log(newArr)
  
  //Array.prototype.slice將arguments轉(zhuǎn)成array
  var newArr2 = Array.prototype.slice.call(arguments)
  console.log(newArr2)
  var newArr3 = [].slice.call(arguments)
  console.log(newArr3)
  
  // 2.3.ES6的語法
  var newArr4 = Array.from(arguments)
  console.log(newArr4)
  var newArr5 = [...arguments]
  console.log(newArr5)

箭頭函數(shù)不綁定arguments

箭頭函數(shù)是不綁定arguments的,所以我們在箭頭函數(shù)中使用arguments會去上層作用域查找

// 1.案例一:
var foo = () => {
  console.log(arguments) // 找不到,報錯
}
foo()

// 2.案例二:
function foo() {
  var bar = () => {
    console.log(arguments) // [123 ...]
  }
  return bar
}
var fn = foo(123)
fn()

JavaScript純函數(shù)

純函數(shù)的定義: 確定的輸入,一定會產(chǎn)生確定的輸出; 函數(shù)在執(zhí)行過程中,不能產(chǎn)生副作用;

副作用: 表示在執(zhí)行一個函數(shù)時,除了返回函數(shù)值之外,還對調(diào)用函數(shù)產(chǎn)生 了附加的影響,比如修改了全局變量,修改參數(shù)或者改變外部的存儲;

純函數(shù)的案例

slice:slice截取數(shù)組時不會對原數(shù)組進行任何操作,而是生成一個新的數(shù)組;slice就是一個純函數(shù),不會修改傳入的參數(shù);

splice:splice截取數(shù)組, 會返回一個新的數(shù)組, 也會對原數(shù)組進行修改; 非純函數(shù)

純函數(shù)優(yōu)勢

只是單純實現(xiàn)自己的業(yè)務(wù)邏輯即可,不需要關(guān)心傳入的內(nèi)容是如何獲得的或者依賴其他的外部變量是否已經(jīng)發(fā)生了修改;

你在用的時候,你確定你的輸入內(nèi)容不會被任意篡改,并且自己確定的輸入,一定會有確定的輸出;

實例:React中就要求我們無論是函數(shù)還是class聲明一個組件,這個組件都必須像純函數(shù)一樣,保護它們的props不被修改

JavaScript柯里化

柯里化:只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個函數(shù)去處理剩余的參數(shù);

function add(x, y, z) {
  return x + y + z
}

var result = add(10, 20, 30)
console.log(result)

function sum1(x) {
  return function(y) {
    return function(z) {
      return x + y + z
    }
  }
}

var result1 = sum1(10)(20)(30)
console.log(result1)

柯里化簡化代碼

// 簡化柯里化的代碼
var sum2 = x => y => z => {
  return x + y + z
}

console.log(sum2(10)(20)(30))

var sum3 = x => y => z => x + y + z
console.log(sum3(10)(20)(30))

柯里化意義:希望一個函數(shù)處理的問題盡可能的單一,而不是將一大堆的處理過程交給一個 函數(shù)來處理;

組合函數(shù)

組合函數(shù):依次執(zhí)行的兩個函數(shù),每次都需要進行兩個函數(shù)的調(diào)用,可將其組合起來,自動依次調(diào)用

function hyCompose(...fns) {
  var length = fns.length
  for (var i = 0; i < length; i++) {
    if (typeof fns[i] !== 'function') {
      throw new TypeError("Expected arguments are functions")
    }
  }

  function compose(...args) {
    var index = 0
    var result = length ? fns[index].apply(this, args): args
    while(++index < length) {
      result = fns[index].call(this, result)
    }
    return result
  }
  return compose
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容