JS函數(shù)式編程01--函數(shù)式編程概念

函數(shù)式編程概念

  • 函數(shù)式編程是一種編程范式。函數(shù)式編程的思維方式就是把現(xiàn)實世界的事物和事物之間的聯(lián)系抽象到程序世界(對運算過程進行抽象)。
  • 函數(shù)式編程中的函數(shù)并不是指的程序中的函數(shù)(方法),而是數(shù)學(xué)中的函數(shù),即映射關(guān)系。比如y = sin(x)中x和y的關(guān)系,當x的值確定時y的值也確定了。
  • 函數(shù)式編程中必須有輸入和輸出。并且相同的輸入要得到相同的輸出。

函數(shù)式編程的常見特性

1. 無副作用

這里指調(diào)用函數(shù)時不會修改外部狀態(tài),一個函數(shù)調(diào)用n次后依然返回相同的結(jié)果。

2. 引用透明

一個函數(shù)只會用到傳遞給它的變量以及自己內(nèi)部創(chuàng)建的變量,不會使用到其他變量。

3. 函數(shù)是一等公民

指的是函數(shù)與其他數(shù)據(jù)類型一樣,處于平等地位,可以賦值給其他變量,也可以作為參數(shù),傳入給另一個函數(shù),或者作為另一個函數(shù)的返回值。

高階函數(shù)

什么是高階函數(shù)

  1. 將一個或多個函數(shù)作為參數(shù)
  2. 可以把函數(shù)作為另一個函數(shù)的返回結(jié)果

我們常用的filter,map,reduce,forEach,every,some等都是高階函數(shù)。

下面模擬一下filter,來體現(xiàn)函數(shù)作為參數(shù)的情況

function filter(array,fn){
  let result = []
  for(let i = 0;i<array.length;i++){
    if(!!fn(array[i])){
      result.push(array[i])
    }
  }
  return result
}

而函數(shù)作為另一個函數(shù)的返回結(jié)果,可以看下面的例子

  //對一個函數(shù)只執(zhí)行一次
function once(fn){
  let done = false;
  return function () {
    if(!done){
      done = true;
      return fn.apply(this,arguments)
    }
  }
}

這個函數(shù)就是返回一個函數(shù),你可以接收這個函數(shù),并定義自己想實現(xiàn)的方法。

  const click = once(function(i){
    console.log(`第${i}次點擊`)  
  })

高階函數(shù)的意義

  • 抽象可以幫我們屏蔽細節(jié),只需要關(guān)注與我們的目標
  • 高階函數(shù)是用來抽象通用的問題
  • 使用函數(shù)式編程可以使代碼更簡潔

閉包

閉包概念

  • 函數(shù)和其周圍的狀態(tài)(詞法環(huán)境)的引用捆綁在一起形成閉包。
  • 可以在另一個作用域中調(diào)用一個函數(shù)的內(nèi)部函數(shù)并訪問到該函數(shù)的作用域中的成員。

閉包本質(zhì)

函數(shù)在執(zhí)行的時候會放到一個執(zhí)行棧上當函數(shù)執(zhí)行完畢后會從執(zhí)行棧上移除,但是堆上的作用域成員因為被外部引用不能釋放,因此內(nèi)部函數(shù)依然可以訪問外部函數(shù)的成員。

閉包作用

閉包延長了外部函數(shù)內(nèi)部變量的作用范圍。

//demo 求多少次方的函數(shù)
function makePow(power){
  return function(number){
    return Math.pow(number,power)
  }
}

純函數(shù)

純函數(shù)的概念:

  • 相同的輸入永遠會得到相同的輸出,而且沒有副作用
  • 純函數(shù)類似于數(shù)學(xué)中的函數(shù),即用來描述輸入和輸出的關(guān)系

純函數(shù)的好處

  • 可緩存 :因為相同輸入有相同的輸出。所以我們可以把相同輸入得到的結(jié)果緩存起來
  • 便于測試
  • 并行處理
    • 在多線程環(huán)境下并行操作共享的內(nèi)存數(shù)據(jù)很可能會出現(xiàn)意外情況
    • 純函數(shù)不需要訪問共享的內(nèi)存數(shù)據(jù),所以在并行環(huán)境下可以任意運行純函數(shù)

函數(shù)的副作用

函數(shù)的副作用就是讓一個函數(shù)不純,即相同的輸入可能會得到不同的輸出。如果函數(shù)依賴于外部的狀態(tài)就無法保證輸出相同,就會帶來副作用。

  • 副作用的來源
    • 配置文件
    • 全局變量
    • 數(shù)據(jù)庫
    • 用戶的輸入
      所有的外部交互都有可能帶來副作用,副作用也使方法通用性下降不適合擴展和可重用性,同時副作用會給程序中帶來安全隱患給程序帶來不確定性,但是副作用不可能完全禁止,盡可能控制它們在可控范圍內(nèi)發(fā)生。

總結(jié)

這篇文章主要總結(jié)了js函數(shù)式編程的一些概念,下一篇會總結(jié)函數(shù)柯里化,函數(shù)組合。
函數(shù)式編程02

最后編輯于
?著作權(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ù)。

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