Functions
What Are Functions in JavaScript?
A function in JavaScript is a potentially reusable set of expressions and statements which accepts an input of zero or more parameters and returns a value.
A function can be defined (aka declared) in two ways. The first way - available in both ES5 and ES6 - is to use 1) the function
keyword along with optional function name, 2) zero or more function parameters enclosed in parenthesis and separated by commas, and 3) the block of code denoted with curly braces.
function sum(a, b) {
return a + b
}
sum(2, 2) // => 4
A function without a name is considered to be an anonymous function
.
(function(a, b) {
return a + b
})(2, 2) // => 4
const sum = function(a, b) { return a + b }
sum(2, 2) // => 4
Returning Values
To return a specific value the keyword return
has to be used. If no return value is specified a function returns this
for constructor functions called with new
and undefined
for all other functions.
Passing Arguments
Primitive data types (such as numbers, strings, or booleans) are passed by value. Non primitive data types (such as objects or arrays) are passed through passing copied values of their references. Therefore, all arguments of any data types are passed by value.
It means that any changes to a value of an argument are not effective outside of the enclosing function body however that does not mean that it is not possible to change the object referenced by the argument.
const enterpriseCaptains = { best_captain: 'Picard' }
function replaceCaptains(captains) {
captains = { best_captain: 'Hook' }
}
replaceCaptains(enterpriseCaptains)
enterpriseCaptains // => { best_captain: 'Picard' }
function changeCaptain(captains) {
captains.best_captain = 'Janeway'
}
changeCaptain(enterpriseCaptains)
enterpriseCaptains // => { best_captain: 'Janeway' }
First Class Citizens
Functions in JavaScript are first class citizens which mean they can be a) passed as arguments to other functions, b) values returned by other functions, and c) pointed to by variables or stored as object property values.
When a function accepts another function as an argument and/or returns a function it is called a higher order function. Otherwise, it is called a first order function.
An example of a higher order function is a map
function.
const numbers = [1,2,3]
numbers.map(function(number) { return number * 2 }) // => [2,4,6]
Hoisting
Function declarations are hoisted, initialized with the declared value and can be called in a given scope before their actual declaration. Compare it to hoisting of var
, let
, and const
.
sum(2, 2) // => 4
function sum(a, b) { return a + b }
Recursion
A function can call itself in three ways: 1) through calling its declared name, 2) through calling the reference to itself, and 3) through calling arguments.callee
from within its body.
Closures
Functions in JavaScript are closures which mean they carry with themselves variables, constants and function declarations declared outside of their bodies but used within their bodies.
Arrow Functions
Another way of declaring a function to a function
keyword is using an arrow function notation that was introduced in ES6.
const sum = (a, b) => { return a + b }
sum(2, 2) // => 4
The curly braces and the return
keyword can be omitted in a one line arrow function in which case the function always returns its body's expression.
const sum = (a, b) => a + b
sum(2, 2) // => 4