什么是JavaScript中不纯函数的示例

时间:2016-03-06 09:11:36

标签: javascript pure-function

看过很多纯粹的功能以及它们如何没有副作用,什么是不纯函数的例子,它总是被作为不稳定和主要错误来源而被对抗?

6 个答案:

答案 0 :(得分:21)

例如,对自身范围之外的变量有副作用的不纯函数:

var count = 0;

function increaseCount(val) {
    count += val;
}

或者为同一输入返回不同值的函数,因为它评估未作为参数给出的变量:

var count = 0;

function getSomething() {
    return count > 0;
}

答案 1 :(得分:6)

纯函数不依赖于并且不会修改变量的状态。

具体地说,这意味着纯函数总是在给定相同参数的情况下返回相同的结果。它的执行不依赖于系统的状态。

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`.

参考:For more details, click here

答案 2 :(得分:3)

Math.random()是一个不纯的功能;它会更改Math对象的内部状态,以便在连续调用时获得不同的值。 console.log()alert()是不纯函数,因为它们有副作用(尽管它们生成相同的行为并且始终为相同的调用返回相同的值)。

任何改变其中一个参数的内部状态或某个外部变量的值的函数都是不纯函数。这包括调用方法更改闭包本身内部状态的闭包:

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.

你在哪里认为不纯的功能总是被认为是坏事?

答案 3 :(得分:1)

  1. Impure functon 是一个返回不同结果的函数 相同的输入参数,也就是说它取决于某种状态;
  2. 对于相同的输入参数可能返回相同结果的函数,但是     改变其他状态对象。它不依赖的对象,但其他人//导致副作用
  3. 示例:

    <强> 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
    

答案 4 :(得分:0)

我能想到的一个例子(确实令人困惑)是Array#reverse()

,它不是返回一个新数组,而是在原处修改它

其他一些数组函数也会执行此操作,例如splicepushshiftpopunshift

答案 5 :(得分:0)

pure函数(获取参数并返回新值):

function (objectArgument) {
   return {
       value: objectArgument.value + 123,
       // other arguments
   };
}

impure函数(获取参数,修改它并返回修改后的对象):

function (objectArgument) {
   objectArgument.value += 123;
   return objectArgument;
}