JavaScript 中不纯函数的例子是什么
What is an example of an impure function in JavaScript
看过很多纯函数以及它们如何没有副作用,什么是不纯函数的例子,它总是被认为是不稳定的和主要的错误来源?
我能想到的一个例子(确实很混乱)是Array#reverse()
。它没有返回一个新数组,而是在返回原始数组的同时对其进行了修改。
其他一些数组函数也是这样做的,例如splice
、push
、shift
、pop
、unshift
.
pure
函数(获取参数和 return 新值):
function (objectArgument) {
return {
value: objectArgument.value + 123,
// other arguments
};
}
impure
函数(获取参数,修改它并return修改对象):
function (objectArgument) {
objectArgument.value += 123;
return objectArgument;
}
例如,一个不纯的函数对其自身范围之外的变量有副作用:
var count = 0;
function increaseCount(val) {
count += val;
}
或者一个函数 returns 相同输入的不同值,因为它评估未作为参数给出的变量:
var count = 0;
function getSomething() {
return count > 0;
}
- 不纯函数 是 return 不同结果的函数
相同的输入参数,也就是说依赖于某个状态;
- 函数对于相同的输入参数可能 return 相同的结果,但是
改变其他状态对象。它不依赖但其他对象依赖的对象 // 导致副作用
示例:
1)
var toggled = false; /* state */
/*impure function*/
function impureFn(number){
if(number%2 == 0)
toggled = true;
return toggled;
}
/*Execute this in order */
impureFn(5) // returns false
impureFn(2) //returns true
impureFn(5) // now returns true
Math.random()
是一个不纯函数;它改变了 Math
对象的内部状态,所以你在连续的调用中得到不同的值。 console.log()
和 alert()
是不纯的函数,因为它们有副作用(尽管它们产生相同的行为并且对于相同的调用总是 return 相同的值)。
任何改变其参数之一的内部状态或某些外部变量的值的函数都是不纯函数。这包括闭包,其中调用方法会更改闭包本身的内部状态:
let nextInt = (function() {
var i = 0;
return function() {
return i++;
};
})();
let a = nextInt(); // sets a to 0
let b = nextInt(); // sets b to 1
// etc.
您从哪里得知不纯函数总是被认为是坏事?
纯函数不依赖也不修改其作用域外的变量状态。
具体来说,这意味着纯函数在给定相同参数的情况下总是returns相同的结果。它的执行不依赖于系统的状态。
var values = { a: 1 };
function impureFunction ( items ) {
var b = 1;
items.a = items.a * b + 2;
return items.a;
}
var c = impureFunction( values );
// Now `values.a` is 3, the impure function modifies it.
这里我们修改给定对象的属性。因此,我们修改了位于函数范围之外的对象:该函数是不纯的。
var values = { a: 1 };
function pureFunction ( a ) {
var b = 1;
a = a * b + 2;
return a;
}
var c = pureFunction( values.a );
我们只是修改函数作用域内的参数,外面什么都没有修改!
var values = { a: 1 };
var b = 1;
function impureFunction ( a ) {
a = a * b + 2;
return a;
}
var c = impureFunction( values.a );
// Actually, the value of `c` will depend on the value of `b`.
// In a bigger codebase, you may forget about that, which may
// surprise you because the result can vary implicitly.
这里,b不在函数的范围内。结果将取决于上下文:预期会有惊喜!
var values = { a: 1 };
var b = 1;
function pureFunction ( a, c ) {
a = a * c + 2;
return a;
}
var c = pureFunction( values.a, b );
// Here it's made clear that the value of `c` will depend on
// the value of `b`.
看过很多纯函数以及它们如何没有副作用,什么是不纯函数的例子,它总是被认为是不稳定的和主要的错误来源?
我能想到的一个例子(确实很混乱)是Array#reverse()
。它没有返回一个新数组,而是在返回原始数组的同时对其进行了修改。
其他一些数组函数也是这样做的,例如splice
、push
、shift
、pop
、unshift
.
pure
函数(获取参数和 return 新值):
function (objectArgument) {
return {
value: objectArgument.value + 123,
// other arguments
};
}
impure
函数(获取参数,修改它并return修改对象):
function (objectArgument) {
objectArgument.value += 123;
return objectArgument;
}
例如,一个不纯的函数对其自身范围之外的变量有副作用:
var count = 0;
function increaseCount(val) {
count += val;
}
或者一个函数 returns 相同输入的不同值,因为它评估未作为参数给出的变量:
var count = 0;
function getSomething() {
return count > 0;
}
- 不纯函数 是 return 不同结果的函数 相同的输入参数,也就是说依赖于某个状态;
- 函数对于相同的输入参数可能 return 相同的结果,但是 改变其他状态对象。它不依赖但其他对象依赖的对象 // 导致副作用
示例:
1)
var toggled = false; /* state */
/*impure function*/
function impureFn(number){
if(number%2 == 0)
toggled = true;
return toggled;
}
/*Execute this in order */
impureFn(5) // returns false
impureFn(2) //returns true
impureFn(5) // now returns true
Math.random()
是一个不纯函数;它改变了 Math
对象的内部状态,所以你在连续的调用中得到不同的值。 console.log()
和 alert()
是不纯的函数,因为它们有副作用(尽管它们产生相同的行为并且对于相同的调用总是 return 相同的值)。
任何改变其参数之一的内部状态或某些外部变量的值的函数都是不纯函数。这包括闭包,其中调用方法会更改闭包本身的内部状态:
let nextInt = (function() {
var i = 0;
return function() {
return i++;
};
})();
let a = nextInt(); // sets a to 0
let b = nextInt(); // sets b to 1
// etc.
您从哪里得知不纯函数总是被认为是坏事?
纯函数不依赖也不修改其作用域外的变量状态。
具体来说,这意味着纯函数在给定相同参数的情况下总是returns相同的结果。它的执行不依赖于系统的状态。
var values = { a: 1 };
function impureFunction ( items ) {
var b = 1;
items.a = items.a * b + 2;
return items.a;
}
var c = impureFunction( values );
// Now `values.a` is 3, the impure function modifies it.
这里我们修改给定对象的属性。因此,我们修改了位于函数范围之外的对象:该函数是不纯的。
var values = { a: 1 };
function pureFunction ( a ) {
var b = 1;
a = a * b + 2;
return a;
}
var c = pureFunction( values.a );
我们只是修改函数作用域内的参数,外面什么都没有修改!
var values = { a: 1 };
var b = 1;
function impureFunction ( a ) {
a = a * b + 2;
return a;
}
var c = impureFunction( values.a );
// Actually, the value of `c` will depend on the value of `b`.
// In a bigger codebase, you may forget about that, which may
// surprise you because the result can vary implicitly.
这里,b不在函数的范围内。结果将取决于上下文:预期会有惊喜!
var values = { a: 1 };
var b = 1;
function pureFunction ( a, c ) {
a = a * c + 2;
return a;
}
var c = pureFunction( values.a, b );
// Here it's made clear that the value of `c` will depend on
// the value of `b`.