大致從兩個方向上進行判斷,
1. 函數的返回結果只依賴於它的參數
2. 執行過程中沒有副作用
對於第一點,下面看一個例子,func1中返回的值只依賴於傳入的參數屬於純函數,而func2中返回的值依賴於外部參數x,是不純的
var x = 1; function func1(a, b){ return a + b; } function func2(a, b){ return a + b + x; }
對於第二點,副作用就是指函數內部使外部環境的產生了可觀察的變化,如下
var count = {price: 10} function func3(obj, a){ return obj.price + a } func3(count, 5) function func4(obj, a){ obj.price = 50 return obj.price + a } func4(count, 5)
在func3中,並未對obj的值進行更改,屬於純函數;在func4中,count的price被改為了50,是不純的
副作用不僅限於此,還包括http請求、調用DOM API更改頁面、發送Ajax請求,甚至console.log也屬於副作用