概念
純函數(shù)是這樣一種函數(shù)断序,與外界交換數(shù)據(jù)只要一個唯一渠道—參數(shù)和返回值丰歌。函數(shù)從外部接收的所有輸入信息都通過參數(shù)傳遞到該函數(shù)內(nèi)部寝志,函數(shù)輸出到外部的所有信息都通過返回值傳遞到該函數(shù)外部。
純函數(shù)不能訪問外部變量燎猛,不能修改參數(shù)曹抬。
純函數(shù)執(zhí)行過程沒有副作用。
通過代碼例子來理解純函數(shù)
例子1
let a=1;
let foo = (b)=>{
return a+b
}
foo(1)
foo函數(shù)不是一個純函數(shù)急鳄,因為它的返回結(jié)果依賴了外部變量a谤民。
例子2
let a=1;
let foo = (b,c)=>{
return b+c
}
foo(1,2)
foo函數(shù)是一個純函數(shù),因為它的返回結(jié)果只依賴于參數(shù)b和c疾宏。
例子3
const a = 1
const foo = (obj, b) => {
obj.x = 2
return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2)
代碼里counter.x計算前是1张足,計算后變成了2,foo函數(shù)的執(zhí)行對外部的counter產(chǎn)生了影響坎藐,修改counter屬性的值为牍,所以這個foo函數(shù)是有副作用的,不是純函數(shù)岩馍。
但是如果在函數(shù)內(nèi)部定義了一個變量碉咆,并且修改了這個變量,沒有對外部產(chǎn)生影響蛀恩,它是沒有副作用的疫铜,是一個純函數(shù),看下面這個例子:
例子4
const a = 1
const foo = (b) => {
const obj = { x: 1 }
obj.x = 2
return obj.x + b
}
foo(2)
除了修改外部變量双谆,函數(shù)在執(zhí)行過程中還有很多方式可以產(chǎn)生副作用壳咕,比如調(diào)用DOM API修改頁面,發(fā)送了ajax請求顽馋,調(diào)用window.reload刷新了瀏覽器谓厘,console.log往控制臺打印數(shù)據(jù),等等都是副作用寸谜。
Redux程序中的reducer就是一個純函數(shù)竟稳,理解了純函數(shù),對理解Redux的源碼有幫助程帕。