JavaScript 理解纯函数和非纯函数的区别

JavaScript 理解纯函数和非纯函数的区别

在本文中,我们将介绍JavaScript中纯函数和非纯函数的概念,以及了解它们的区别,并对概念进行基本实现,以便更好地理解。

纯函数: 这个函数在给定相同的输入参数时总是返回相同的输出。纯函数只依赖于它们的输入参数,不会影响应用程序的状态或代码的其他部分。

当函数尝试在函数内部使用任何外部代码时,会发生副作用/变量泄漏,从而影响函数执行特定任务的能力。

特征:

  • 函数不修改任何状态,也没有任何副作用。
  • 函数只依赖于它们的输入参数。
  • 这些函数是可预测的,具有确定性行为,并且更容易进行测试、调试和维护。

    优点:

  • 纯函数更容易进行测试,因为它们具有可预测的行为,不修改任何状态或具有副作用。

  • 可以组合这些函数以创建复杂的行为,而且组合也是纯净的。
  • 纯函数用于进行性能优化的记忆化,因为相同的输入将始终返回相同的输出,并且不太可能在代码中引入错误或意外行为。

    缺点:

  • 当问题需要状态更改或副作用时,纯函数编写起来可能更困难。

  • 需要额外的开销来将所有必要的数据作为输入参数传递。

    示例1: 这个示例描述了一个纯函数。在这个示例中, geek() 是一个纯函数,因为它在给定相同的输入参数时总是返回相同的输出。它不会修改任何状态或对代码产生副作用。当调用函数geek时,它通过内部函数传递输出并返回值。

Javascript

function geek(value) { 
    return value+100; 
} 
  
console.log(geek(34));  
console.log(geek(4));   
console.log(geek(12));

输出

134
104
112

例如,geek(34)将返回输出为100+34 = 134。我们可以清楚地看到这不会修改整个代码。

示例2: 在这个例子中, capitalize() 函数接受一个字符串作为输入参数,并返回一个所有字符都大写的新字符串。由于它不修改任何状态或产生副作用,它是一个纯函数。

Javascript

function capitalize(str) { 
  return str.toUpperCase(); 
} 
  
console.log(capitalize('geeks')); // Output: GEEKS 
console.log(capitalize('world')); // Output: WORLD 

输出

GEEKS
WORLD

不纯函数: 不纯函数是可以修改应用程序状态或具有副作用的函数。换句话说,不纯函数可能具有不可预测的行为,并且会影响到应用程序的其他部分。

特点:

  • 函数可以修改应用程序状态或具有副作用。
  • 函数依赖于代码的其他部分。
  • 这些函数是不可预测的,可能具有非确定性行为,并且更难进行测试和维护。

优点:

  • 它们可以具有副作用或修改应用程序的状态,这对于许多任务如I/O操作或DOM操作是必要的。
  • 不纯函数更容易编写,可能需要更少的输入参数。
  • 函数更加灵活,适应不同的用例。

缺点:

  • 不纯函数更难理解和测试,因为它们的行为可能是不可预测的,并且依赖于代码的其他部分。
  • 函数可能在代码中引入错误或意外行为。
  • 它们可能更难组合在一起创建复杂的行为。

示例3: 在这个例子中, incrementflag() 是一个不纯函数,因为它修改了在其作用域之外的flag变量。第一次调用incrementflag()时,flag值增加到1并在控制台上打印出来。但是,当第二次调用时,increment()函数将flag的先前值增加了1,并且更新后的值为2。因此,这个不纯函数increment同时修改了flag和状态。

JavaScript

let flag = 0; 
function incrementflag() { 
    flag++; 
} 
incrementflag(); 
console.log(flag);  
  
incrementflag(); 
console.log(flag);

输出

1
2

示例4: 在这个例子中, getRandomNumber() 函数在每次调用时生成一个介于0和9之间的随机数,这是一个副作用。因此,它是一个不纯的函数。另外,请注意,即使有相同的输入,该函数的输出也可以是不同的(在本例中没有)。

JavaScript

function getRandomNumber() { 
  return Math.floor(Math.random() * 10); 
} 
  
console.log(getRandomNumber()); 
console.log(getRandomNumber());

输出

7
4

纯函数和非纯函数之间的区别:

特点 纯函数 非纯函数
状态修改 不修改应用程序的状态 可以修改应用程序的状态
依赖 只依赖于输入参数 可以依赖于代码的其他部分
测试 更容易测试 较难测试
维护 维护较为容易 维护较为困难

总之,纯函数在测试、调试和维护等方面比非纯函数具有多个优势。纯函数只依赖于输入参数,不修改应用程序的状态或产生副作用。而非纯函数可能具有不可预测的行为,可以修改应用程序的状态或产生副作用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程