定義:純函數是指不依賴于 且 不改變 它作用域之外的變量狀態的函數。
也就是說,純函數的返回值只由它調用時的參數決定,它的執行不依賴于系統的狀態(比如:何時、何處調用它。
例子:
例1:
非純函數:
var values = { a: 1 };?
function impureFunction ( items ) {?
? ? ? ?var b = 1;???
? ? ? ?items.a = items.a * b + 2;??
? ? ? ?return items.a;
}
?var c = impureFunction( values );// 現在 `values.a` 變成 3。impureFunction 改變了它,所以不純。
純函數:
var values = { a: 1 };
?function pureFunction ( a ) {?
?????????var b = 1;??
?????????a = a * b + 2;??
?????????return a;
}
?var c = pureFunction( values.a );
// `values.a` 沒有被改變, 它的值仍然是 1
例2:
非純函數:
var values = { a: 1 };
var b = 1;?
function impureFunction ( a ) {?
? ? ? a = a * b + 2;???
? ? ? return a;
}?
var c = impureFunction( values.a );
// c 的值依賴于外部變量 b
// 你可能容易忽略這種情況,外部變量的變化也可能會導致函數出現不確定結果。
純函數:
var values = { a: 1 };
var b = 1;?
function pureFunction ( a, c ) {?
????????a = a * c + 2;???
????????return a;
}
?var c = pureFunction( values.a, b );
// 這樣從定義上明確 `c` 依賴于參數 `b`,避免函數不確定結果。