什么是“纯函数”
纯函数是指不依赖于且不改变它作用域之外的变量状态的函数。
也就是说,纯函数的返回值只由它调用时的参数决定,它的执行不依赖于系统的状态(比如:何时、何处调用它——译者注)。
纯函数是函数式编程的一个基础。
来看一些例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
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 改变了它。 |
在上面的代码中,我们改变了参数对象中的一个属性。由于我们定义的函数改变的对象在我们的函数作用域之外,导致这个函数成为“不纯”的函数。
1 2 3 4 5 6 7 8 9 10 11 12 |
var values = { a: 1 }; function pureFunction ( a ) { var b = 1; a = a * b + 2; return a; } var c = pureFunction( values.a ); // `values.a` 没有被改变, 它的值仍然是 1 |
上面的代码,我们只计算了作用域内的局部变量,没有任何作用域外部的变量被改变,因此这个函数是“纯函数”。
1 2 3 4 5 6 7 8 9 10 11 12 |
var values = { a: 1 }; var b = 1; function impureFunction ( a ) { a = a * b + 2; return a; } var c = impureFunction( values.a ); // 实际上, `c` 的值依赖于外部变量 `b`. // 你可能容易忽略这种情况,外部变量的变化也可能会导致函数出现不确定结果。 |
上面的代码里,b
不在作用域中,函数执行结果依赖于上下文环境,因此函数也是“不纯”的。
1 2 3 4 5 6 7 8 9 10 11 |
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`,避免函数不确定结果。 |
上面这样改就成了“纯函数”。
具体应用
考虑以下代码:
1 2 |
var getMinQuantity = function getMinQuantity ( name ) { // 一个纯函数根据传入的名字返回对应的数量 |
我们看一下在一个实际项目中的代码例子:
什么是“纯函数”
纯函数是指不依赖于且不改变它作用域之外的变量状态的函数。
也就是说,纯函数的返回值只由它调用时的参数决定,它的执行不依赖于系统的状态(比如:何时、何处调用它——译者注)。
纯函数是函数式编程的一个基础。
来看一些例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
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 改变了它。 |
在上面的代码中,我们改变了参数对象中的一个属性。由于我们定义的函数改变的对象在我们的函数作用域之外,导致这个函数成为“不纯”的函数。
1 2 3 4 5 6 7 8 9 10 11 12 |
var values = { a: 1 }; function pureFunction ( a ) { var b = 1; a = a * b + 2; return a; } var c = pureFunction( values.a ); // `values.a` 没有被改变, 它的值仍然是 1 |
上面的代码,我们只计算了作用域内的局部变量,没有任何作用域外部的变量被改变,因此这个函数是“纯函数”。
1 2 3 4 5 6 7 8 9 10 11 12 |
var values = { a: 1 }; var b = 1; function impureFunction ( a ) { a = a * b + 2; return a; } var c = impureFunction( values.a ); // 实际上, `c` 的值依赖于外部变量 `b`. // 你可能容易忽略这种情况,外部变量的变化也可能会导致函数出现不确定结果。 |
上面的代码里,b
不在作用域中,函数执行结果依赖于上下文环境,因此函数也是“不纯”的。
1 2 3 4 5 6 7 8 9 10 11 |
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`,避免函数不确定结果。 |
上面这样改就成了“纯函数”。
具体应用
考虑以下代码:
1 2 |
var getMinQuantity = function getMinQuantity ( name ) { // 一个纯函数根据传入的名字返回对应的数量 |
我们看一下在一个实际项目中的代码例子: