TL;DR: Explore the distinction between pure and impure functions in JavaScript, where pure functions maintain predictability by avoiding side effects, while impure functions may alter external variables and yield varied results with the same inputs. Understand when to use each type to enhance code efficiency and minimize potential issues.
Pure functions and impure functions are two common terms used in JavaScript. On the surface level, both functions look identical.
However, if we look closer, there are some major differences between them. As developers, it is essential to understand the similarities and differences of these functions to get the most out of them.
In this article, I will discuss pure and impure JavaScript functions in depth and highlight their uses, advantages, and differences.
In simple terms, pure functions do not have an internal state. Therefore, all operations performed in pure functions are not affected by their state. As a result, the same input parameters will give the same deterministic output regardless of how many times you run the function.
To get a better understanding, let’s consider the following example.
function add(a,b) { return a + b } console.log(add(4,5))
This example contains a simple add() function, which gives 9 as the output. It is a very predictable output, and it does not depend on any external code. This makes the add() function a pure function.
If a function is declared pure and does not have a state, it can share many instances inside a class. Also, it is advised to avoid mutations inside pure functions.
An impure function is a function that contains one or more side effects. It mutates data outside of its lexical scope and does not predictably produce the same output for the same input.
For example, consider the following code snippet:
var addNew = 0; function add(a,b){ addNew =1; return a + b + addNew } console.log(add(4,5))
In the above example, there is a variable named addNew, and it is declared outside of the add() function. But the state of that variable is changed inside the add() function. So, the add() function has a side effect on a variable outside of its scope and is therefore considered an impure function.
JavaScript doesn’t adhere to rigorous notions of function purity and immutability. Any program you develop will need impure functions to modify the state of JavaScript variables (named memory locations).
In general, it’s ideal to keep the impure elements of your programs distinct from the data processing, which is usually pure. Also, updating and maintaining your applications will be much easier if you confine impure elements to their particular functions.
The following JavaScript functions are inherently impure:
Math.random(); (Output: 0.4450692005082965) Math.random(); (Output: 0.7533405303023756) Math.random(); (Output: 0.4011148700956255)
In the above code snippet, no arguments pass into any of the Math.random() function calls, but still they all produce a different result.
As mentioned, the main difference between pure and impure functions in JavaScript is side effects. So, let’s discuss some specifics about the side effects.
Side effects can occur in your program when it uses an external code block inside a function. As a result, there can be performance issues in your application.
Let’s consider the following example and discuss the side effects in detail.
var preNumber =2; function addValue(newNumber){ return preNumber += newNumber; }
In the above example, the variable preNumber is used inside the addValue() function. This behavior can result in the following side effects.
The addValue() method depends on the preNumber variable. If preNumber is not defined or not available, the method will throw an error.
When the addValue() function executes, it changes the state of the preNumber variable. It shows that the addValue() method has a side effect of modifying external code.
The addValue() function uses external code. It makes the function non-deterministic, which means you cannot determine the output by looking.
Let’s compare and contrast the differences between pure and impure functions:
In this article, I discussed the pure and impure functions in JavaScript and compared the differences between them.
Overall, using pure functions will avoid unnecessary issues in your code. However, we can’t always stick to pure functions. There are situations where we need to use impure functions. We must be mindful of the side effects and minimize unnecessary issues in such situations.
Syncfusion has 80+ JavaScript UI controls to improve developer productivity. Using the Syncfusion JavaScript UI controls in your application can reduce development time exponentially. The main controls in the JavaScript suite are DataGrid, Charts, and Scheduler.
I hope you found this article useful. Thank you for reading.