---
id: 513ff88e-d0c9-41d1-8416-57a4aff100c7
title: JavaScript higher-order functions
---

# Examples

Functions that operate on other functions, either by taking them as
arguments or by returning them, are called higher-order functions. They
allow us to abstract over actions as well as values. There are several
types, here are some examples.

## Functions that create new functions

``` javascript
function greaterThan(n) {
  return m => m > n;
}
let greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
```

## Functions that change other functions

``` javascript
function noisy(f) {
  return (...args) => {
    console.log("calling with", args);
    let result = f(...args);
    console.log("called with", args, ", returned", result);
    return result;
  };
}
noisy(Math.min)(3, 2, 1);
```

## Functions that provide new types of flow control

``` javascript
function unless(test, then) {
  if (!test) then();
}

repeat(3, n => {
  unless(n % 2 == 1, () => {
    console.log(n, "is even");
  });
});
```

## ES6

### Funciton properties

1.  name

    The `name` property contains the function's name:

    ``` javascript
    function foo() {};
    console.log(foo.name); // foo

    let func1 = function () {};
    console.log(func1.name); // func1

    let func4;
    func4 = function () {};
    console.log(func4.name); // func4
    ```

    1.  Default values

        ``` javascript
        let [func1 = function () {}] = [];
        console.log(func1.name); // func1

        let { f2: func2 = function () {} } = {};
        console.log(func2.name); // func2

        function g(func3 = function () {}) {
            return func3.name;
        }
        console.log(g()); // func3
        ```