# Functions
Functions are one of the fundamental building blocks in JavaScript. A function is a block of code designed to perform a particular task in a repeatable way.
A function is in essence a mini-program inside of your program.
For example instead of writing
```js
const average = (1 + 2 + 3) / 3;
const average2 = (5 + 2 + 6) / 3;
const average3 = (8 + 8 + 8) / 3;
const average4 = (9 + 2 + 3) / 3;
```
we could create a function that calculates the average of three numbers:
```js
function averageOfThreeNumbers(a, b, c) {
return (a + b + c) / 3;
};
```
Functions can be assigned identifiers, just like literal values can be assigned to variables.
Using the identifier, a function can then be **invoked** whenever that code block is required.
To invoke a function, you append `()` to its identifier.
```js
function averageOfThreeNumbers(a, b, c) {
return (a + b + c) / 3;
};
const average = averageOfThreeNumbers(1, 2, 3);
const average2 = averageOfThreeNumbers(5, 2, 6);
const average3 = averageOfThreeNumbers(8, 8, 8);
const average4 = averageOfThreeNumbers(9, 2, 3);
```
In this example, the code block is only one line long but it is easy to see that when working with long code blocks, functions are really useful.
## Function definition
Functions are defined using the `function` keyword.
```js
function doSomething (parameter) {
// some statements
};
```
The above is called a **function declaration**, and creates a function called `doSomething` that has access to a variable called `parameter`
Functions can also be created using a **function expression**:
```js
const doSomething = function(parameter) {
// some statements
};
```
This does essentially the same thing as the first example. However, using a function expression allows you to create **anonymous functions**: functions with no name. the above function is anonymous, because it is not given a name between the `function` keyword and the parameter list.
Anonymous functions are useful when creating a function to pass as a parameter into another function, such as to an array enumerator.
## Return value
The `return` keyword can be used to stop the execution of the code in the function and provide a value back to the context in which the function was called.
```js
function add(a, b) {
return a * b;
}
const x = add(4, 3);
```
In the above example, the return value of `add` will be assigned to `x`;
Any code in a function after a return statement will not be executed.
## Function parameters
Parameters are values that get injected into the function as variables, taking their names/identifiers from the parameter name in the function definition.
So writing
```js
function averageOfThreeNumbers(a, b, c) {
return (a + b + c) / 3;
};
averageOfThreeNumbers(1, 2, 3);
```
is a bit like writing
```js
const a = 1;
const b = 2;
const c = 3;
(a + b + c) / 3;
```
## Function scope
Every function creates its own **scope**. This means that any variables created inside of a function (including the parameters), are not accessible outside of the function.
```js
const foo = 10;
function doSomething() {
const foo = 50;
console.log(foo);
};
console.log(foo); // logs 10 - the value of foo outside of the function
doSomething(); // logs 50 - the value of foo inside the function
```
## Arrow functions
Functions can also be created using **arrow syntax**:
```js
const doSomething = (parameter) => {
// some statements
};
```
This is shorthand for the function expressions above. Arrow functions are a new addition to JavaScript. They are always anonymous.
The main benefit of arrow function is that they allow **implicit returns** for functions that only contains a `return` statement:
```js
const sayHello = name => 'Hello ' + name;
```
is the same as
```js
const sayHello = (name) => {
return 'Hello ' + name;
};
```