# Understanding Pure Functions in React Functional Components: Importance and How to Implement

%%[kempo] 

You've probably heard the term "pure function" before, but if not, it's a function that follows two principles:

1. **No Side Effects:** a pure function must not alter any objects or variables that exist before it's invoked
    
2. **Deterministic:** a pure function must always return the same output when given the same set of inputs
    

In other words, you can tell if a function is "pure" if it's consistent and doesn't affect anything outside its scope.

An `add` function is a basic example of a pure function:

```javascript
function add(a, b) {
    return a + b;
}
```

In the example above, the `add` function always returns the same result when you give it a specific set of inputs. `2 + 3` will always equal `5` (if for some reason it doesn't, then we probably have bigger problems).

## React assumes functional components are pure

If your React components aren't pure functions, that'll likely lead to unpredictable and buggy applications. In other words, given the same set of props (i.e. inputs), your component should *always* return the same JSX (i.e. output).

Let's take a look at an example:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2wwamJiZzI2MDV2YW94OGVzNm5tOHFybCIsIm5hbWUiOiJSZWFjdCBQdXJlIEZ1bmN0aW9ucyBFeGFtcGxlcyIsImNvcmUiOnsiZmlsZXMiOnsiL3N0eWxlcy5jc3MiOnsiY29kZSI6ImJvZHkge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIGZvbnQtc21vb3RoOiBhbHdheXM7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcbn1cblxucCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xufVxuIn0sIi90c2NvbmZpZy5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiaW5jbHVkZVwiOiBbXG4gICAgXCIuLyoqLypcIlxuICBdLFxuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJzdHJpY3RcIjogdHJ1ZSxcbiAgICBcImVzTW9kdWxlSW50ZXJvcFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFsgXCJkb21cIiwgXCJlczIwMTVcIiBdLFxuICAgIFwianN4XCI6IFwicmVhY3QtanN4XCJcbiAgfVxufSJ9LCIvQXBwLnRzeCI6eyJjb2RlIjoidHlwZSBCYW5uZXJQcm9wcyA9IHsgbmFtZTogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIEJhbm5lcihwcm9wczogQmFubmVyUHJvcHMpIHtcbiAgcmV0dXJuIDxwPkhlbGxvIHtwcm9wcy5uYW1lfSE8L3A+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKTogSlNYLkVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8QmFubmVyIG5hbWU9XCJKYWNrXCIgLz5cbiAgICAgIDxCYW5uZXIgbmFtZT1cIkppbGxcIiAvPlxuICAgIDwvPlxuICApO1xufVxuIn0sIi9pbmRleC50c3giOnsiY29kZSI6ImltcG9ydCBSZWFjdCwgeyBTdHJpY3RNb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcbmltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcFwiO1xuXG5jb25zdCByb290ID0gY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikpO1xucm9vdC5yZW5kZXIoXG4gIDxTdHJpY3RNb2RlPlxuICAgIDxBcHAgLz5cbiAgPC9TdHJpY3RNb2RlPlxuKTsifSwiL3B1YmxpYy9pbmRleC5odG1sIjp7ImNvZGUiOiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiPlxuICAgIDx0aXRsZT5Eb2N1bWVudDwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuPC9odG1sPiJ9LCIvcGFja2FnZS5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl40LjAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcIkB0eXBlcy9yZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjQuMC4wXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LnRzeFwiXG59In19LCJ0ZW1wbGF0ZSI6InJlYWN0LXRzIn0sImRpc3BsYXkiOnsiY29tcG9uZW50cyI6eyJFZGl0b3IiOnsidHlwZSI6ImVkaXRvciIsImRhdGEiOnsic2hvd1RhYnMiOmZhbHNlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjp0cnVlLCJ3cmFwQ29udGVudCI6dHJ1ZSwiY2xvc2FibGVUYWJzIjpmYWxzZSwicmVhZE9ubHkiOnRydWUsInNob3dSZWFkT25seSI6dHJ1ZX19LCJQcmV2aWV3Ijp7InR5cGUiOiJwcmV2aWV3IiwiZGF0YSI6eyJzaG93TmF2aWdhdG9yIjpmYWxzZSwic2hvd09wZW5JbkNvZGVTYW5kYm94IjpmYWxzZSwic2hvd1JlZnJlc2hCdXR0b24iOmZhbHNlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOmZhbHNlfX19LCJnZW5lcmFsIjp7ImFjdGl2ZUZpbGUiOiIvQXBwLnRzeCIsInRoZW1lIjoia2VtcG9EYXJrIn0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="500px" width="100%"></iframe>

In the example above, the `Banner` component takes a `name` prop and displays a welcome message.

Given a specific value for the `name` prop, the JSX the `Banner` component returns will *always* be the same. If you pass the name `Jack` to the `Banner` component, it's impossible for the text to be anything other than `Hello Jack!`.

### Impure components lead to inconsistent JSX

An impure component can lead to unexpected behavior:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2wwamJiZzI2MDV2YW94OGVzNm5tOHFybCIsIm5hbWUiOiJSZWFjdCBQdXJlIEZ1bmN0aW9ucyBFeGFtcGxlcyIsImNvcmUiOnsiZmlsZXMiOnsiL3N0eWxlcy5jc3MiOnsiY29kZSI6ImJvZHkge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIGZvbnQtc21vb3RoOiBhbHdheXM7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcbn1cblxucCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xufVxuIn0sIi90c2NvbmZpZy5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiaW5jbHVkZVwiOiBbXG4gICAgXCIuLyoqLypcIlxuICBdLFxuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJzdHJpY3RcIjogdHJ1ZSxcbiAgICBcImVzTW9kdWxlSW50ZXJvcFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFsgXCJkb21cIiwgXCJlczIwMTVcIiBdLFxuICAgIFwianN4XCI6IFwicmVhY3QtanN4XCJcbiAgfVxufSJ9LCIvQXBwLnRzeCI6eyJjb2RlIjoidHlwZSBCYW5uZXJQcm9wcyA9IHsgbmFtZTogc3RyaW5nIH07XG5cbmxldCB0aW1lID0gMjM7XG5cbmZ1bmN0aW9uIEJhbm5lcihwcm9wczogQmFubmVyUHJvcHMpIHtcbiAgY29uc3QgaXNQTSA9IHRpbWUgPiAxMTtcbiAgdGltZSA9IHRpbWUgJSAxMjtcblxuICByZXR1cm4gKFxuICAgIDxwPlxuICAgICAgSGVsbG8ge3Byb3BzLm5hbWV9LCBpdCdzIHt0aW1lfSB7aXNQTSA/IFwiUE1cIiA6IFwiQU1cIn0hXG4gICAgPC9wPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKTogSlNYLkVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8QmFubmVyIG5hbWU9XCJKYWNrXCIgLz5cbiAgICAgIDxCYW5uZXIgbmFtZT1cIkppbGxcIiAvPlxuICAgIDwvPlxuICApO1xufVxuIn0sIi9pbmRleC50c3giOnsiY29kZSI6ImltcG9ydCBSZWFjdCwgeyBTdHJpY3RNb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcbmltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcFwiO1xuXG5jb25zdCByb290ID0gY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikpO1xucm9vdC5yZW5kZXIoPEFwcCAvPik7XG4ifSwiL3B1YmxpYy9pbmRleC5odG1sIjp7ImNvZGUiOiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiPlxuICAgIDx0aXRsZT5Eb2N1bWVudDwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuPC9odG1sPiJ9LCIvcGFja2FnZS5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl40LjAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcIkB0eXBlcy9yZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjQuMC4wXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LnRzeFwiXG59In19LCJ0ZW1wbGF0ZSI6InJlYWN0LXRzIn0sImRpc3BsYXkiOnsiY29tcG9uZW50cyI6eyJFZGl0b3IiOnsidHlwZSI6ImVkaXRvciIsImRhdGEiOnsic2hvd1RhYnMiOmZhbHNlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjp0cnVlLCJ3cmFwQ29udGVudCI6dHJ1ZSwiY2xvc2FibGVUYWJzIjpmYWxzZSwicmVhZE9ubHkiOnRydWUsInNob3dSZWFkT25seSI6dHJ1ZX19LCJQcmV2aWV3Ijp7InR5cGUiOiJwcmV2aWV3IiwiZGF0YSI6eyJzaG93TmF2aWdhdG9yIjpmYWxzZSwic2hvd09wZW5JbkNvZGVTYW5kYm94IjpmYWxzZSwic2hvd1JlZnJlc2hCdXR0b24iOmZhbHNlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOmZhbHNlfX19LCJnZW5lcmFsIjp7ImFjdGl2ZUZpbGUiOiIvQXBwLnRzeCIsInRoZW1lIjoia2VtcG9EYXJrIn0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="500px" width="100%"></iframe>

This time, the `Banner` component takes a `time` variable defined outside of it and displays it along with the name. We use `time % 12` to convert the time to a range between `1 - 12` and then add `AM` or `PM` to indicate whether it's morning or night.

However, because the first `Banner` component *modifies* the `time` component, the second `Banner` component shows `AM` instead of `PM`. When the first `Banner` component renders, it sets the `time` variable to `11` (i.e. `23 % 12 === 11`), which the second `Banner` component then uses.

> Note: If you run this with [StrictMode](https://react.dev/reference/react/StrictMode) enabled, it will actually show `11 AM` for both Banners because React renders each component twice in a `dev` environment.

### Access variables via props instead of via closures

In the example above, the `Banner` component has access to the `time` variable via a closure. Instead of doing this, you can fix the problem by just passing the time as a prop instead:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2wwamJiZzI2MDV2YW94OGVzNm5tOHFybCIsIm5hbWUiOiJSZWFjdCBQdXJlIEZ1bmN0aW9ucyBFeGFtcGxlcyIsImNvcmUiOnsiZmlsZXMiOnsiL3N0eWxlcy5jc3MiOnsiY29kZSI6ImJvZHkge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1mb250LXNtb290aGluZzogYXV0bztcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIGZvbnQtc21vb3RoOiBhbHdheXM7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcbn1cblxucCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xufVxuIn0sIi90c2NvbmZpZy5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiaW5jbHVkZVwiOiBbXG4gICAgXCIuLyoqLypcIlxuICBdLFxuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJzdHJpY3RcIjogdHJ1ZSxcbiAgICBcImVzTW9kdWxlSW50ZXJvcFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFsgXCJkb21cIiwgXCJlczIwMTVcIiBdLFxuICAgIFwianN4XCI6IFwicmVhY3QtanN4XCJcbiAgfVxufSJ9LCIvQXBwLnRzeCI6eyJjb2RlIjoidHlwZSBCYW5uZXJQcm9wcyA9IHsgbmFtZTogc3RyaW5nOyB0aW1lOiBudW1iZXIgfTtcblxuLy8gVGhpcyBpcyBubyBsb25nZXIgdXNlZC4uLlxubGV0IHRpbWUgPSAyMztcblxuZnVuY3Rpb24gQmFubmVyKHByb3BzOiBCYW5uZXJQcm9wcykge1xuICBjb25zdCBpc1BNID0gcHJvcHMudGltZSA+IDExO1xuICBjb25zdCB0aW1lID0gcHJvcHMudGltZSAlIDEyO1xuXG4gIHJldHVybiAoXG4gICAgPHA+XG4gICAgICBIZWxsbyB7cHJvcHMubmFtZX0sIGl0J3Mge3RpbWV9IHtpc1BNID8gXCJQTVwiIDogXCJBTVwifSFcbiAgICA8L3A+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpOiBKU1guRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxCYW5uZXIgbmFtZT1cIkphY2tcIiB0aW1lPXsyM30gLz5cbiAgICAgIDxCYW5uZXIgbmFtZT1cIkppbGxcIiB0aW1lPXsyM30gLz5cbiAgICA8Lz5cbiAgKTtcbn1cbiJ9LCIvaW5kZXgudHN4Ijp7ImNvZGUiOiJpbXBvcnQgUmVhY3QsIHsgU3RyaWN0TW9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgXCIuL3N0eWxlcy5jc3NcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi9BcHBcIjtcblxuY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb290XCIpKTtcbnJvb3QucmVuZGVyKDxBcHAgLz4pO1xuIn0sIi9wdWJsaWMvaW5kZXguaHRtbCI6eyJjb2RlIjoiPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIj5cbiAgICA8dGl0bGU+RG9jdW1lbnQ8L3RpdGxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxkaXYgaWQ9XCJyb290XCI+PC9kaXY+XG4gIDwvYm9keT5cbjwvaHRtbD4ifSwiL3BhY2thZ2UuanNvbiI6eyJjb2RlIjoie1xuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJyZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LWRvbVwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LXNjcmlwdHNcIjogXCJeNC4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJAdHlwZXMvcmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIl40LjAuMFwiXG4gIH0sXG4gIFwibWFpblwiOiBcIi9pbmRleC50c3hcIlxufSJ9fSwidGVtcGxhdGUiOiJyZWFjdC10cyJ9LCJkaXNwbGF5Ijp7ImNvbXBvbmVudHMiOnsiRWRpdG9yIjp7InR5cGUiOiJlZGl0b3IiLCJkYXRhIjp7InNob3dUYWJzIjpmYWxzZSwic2hvd0xpbmVOdW1iZXJzIjp0cnVlLCJzaG93SW5saW5lRXJyb3JzIjpmYWxzZSwic2hvd1J1bkJ1dHRvbiI6dHJ1ZSwid3JhcENvbnRlbnQiOnRydWUsImNsb3NhYmxlVGFicyI6ZmFsc2UsInJlYWRPbmx5Ijp0cnVlLCJzaG93UmVhZE9ubHkiOnRydWV9fSwiUHJldmlldyI6eyJ0eXBlIjoicHJldmlldyIsImRhdGEiOnsic2hvd05hdmlnYXRvciI6ZmFsc2UsInNob3dPcGVuSW5Db2RlU2FuZGJveCI6ZmFsc2UsInNob3dSZWZyZXNoQnV0dG9uIjpmYWxzZSwic2hvd1NhbmRwYWNrRXJyb3JPdmVybGF5IjpmYWxzZX19fSwiZ2VuZXJhbCI6eyJhY3RpdmVGaWxlIjoiL0FwcC50c3giLCJ0aGVtZSI6ImtlbXBvRGFyayJ9LCJsYXlvdXRzIjp7InNtYWxsIjoiJ0VkaXRvcidcbidFZGl0b3InXG4nUHJldmlldycifX19" height="500px" width="100%"></iframe>

### Mutating local variables is okay!

Remember, pure functions must not alter any objects or variables that exist before they're invoked. This means a pure function can update an object or variable that's created *when* it's invoked. In other words, you can update local variables all day long without making the function impure!

The following is perfectly acceptable:

```typescript
type BannerProps = { name: string; time: number };

function Banner(props: BannerProps) {
    let time = props.time;
    if (time > 23) {
        time = 0;
    }

    const isPM = time > 11;
    time = time % 12;

    return (
        <p>
          Hello {props.name}, it's {time} {isPM ? "PM" : "AM"}!
        </p>
    );
}
```

In this example, if the `time` variable is greater than `23`, we reset it back to `0`. You can see that throughout the component, we're updating the `time` variable in several places. This is completely fine because the `time` variable was initialized *inside* the `Banner` component.

## Why are pure components important in React?

Here are a few reasons why keeping your React components pure is beneficial:

1. **Predictability**: Pure components are predictable, making debugging easier.
    
2. **Performance**: Pure components are cacheable, which lets React optimize rendering (i.e. skip renders when inputs haven't changed).
    
3. **Server-Side Rendering**: Pure components are deterministic, so your server can reuse them for many requests.
    
4. **Concurrent Mode**: React can optimize rendering by pausing and resuming the render cycle without issues because pure components don’t rely on side effects.
    

It's important to make sure your components are pure. If you don't, your applications will be harder to maintain and less reliable in the long run!
