函數(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ù)
- 將一個或多個函數(shù)作為參數(shù)
- 可以把函數(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