The function `λx.x x`

is the self application function. It applies its argument to its argument.

```
// λx.x x
const sa = x => x(x)
```

Like the identity function, it doesn't seem helpful at first glance but it has some interesting applications. Consider the twice function `λf.λx.f (f x)`

, which applies function `f`

to the value `x`

and then applies function `f`

again to the result of that.

```
// λf.λx.f (f x)
const twice = f => x => f(f(x))
const addOne = a => a + 1
twice(addOne)(1) // 3
```

By supplying the `twice`

function with the `addOne`

function, and then supplying the resulting function with `1`

, we get `3`

. That's because `twice(addOne)(1)`

is the same as `addOne(addOne(1))`

or `1 + 1 + 1`

.

Going back to the self application function, since it applies its argument to its argument, given the function `twice`

, it will apply `twice`

to `twice`

, applying the `addOne`

function four times.

```
// λx.x x
const sa = x => x(x)
// λf.λx.f (f x)
const twice = f => x => f(f(x))
// (λx.x x) (λf.λx.f (f x))
const fourTimes = sa(twice)
const addOne = a => a + 1
fourTimes(addOne)(1) // 5
```